如果我正在运行一个长时间运行的进程,并且当我使用Ctrl+停止它时Z,我会在终端中收到以下消息:
76381 suspended git clone git@bitbucket.org:kevinburke/<large-repo>.git
当进程暂停时实际发生了什么?状态是否保存在内存中?此功能是否在操作系统级别实现?当我重新启动它时,该进程如何能够在它停止的地方恢复执行fg
?
如果我正在运行一个长时间运行的进程,并且当我使用Ctrl+停止它时Z,我会在终端中收到以下消息:
76381 suspended git clone git@bitbucket.org:kevinburke/<large-repo>.git
当进程暂停时实际发生了什么?状态是否保存在内存中?此功能是否在操作系统级别实现?当我重新启动它时,该进程如何能够在它停止的地方恢复执行fg
?
当您在终端中点击Ctrl+Z时,(伪)终端设备驱动程序(内核)的行规会向终端设备SIGTSTP
的前台进程组中的所有进程发送信号。
该进程组是终端设备的属性。通常,您的 shell 是定义哪个进程组是终端设备的前台进程组的进程。
在 shell 术语中,进程组称为“作业”,您可以使用 and 命令将作业置于前台和后台,并使用该fg
命令bg
了解当前正在运行的作业jobs
。
SIGTSTP
信号就像信号一样,除了SIGSTOP
相反SIGSTOP
,SIGTSTP
可以由一个进程处理。
在接收到这样的信号时,该过程被暂停。也就是说,它已暂停并仍然存在,只是它不会被安排运行,直到它被杀死或发送SIGCONT
信号以恢复执行。启动作业的 shell 将在其中等待进程组的领导者。如果它被挂起,wait()
则将返回指示该进程已挂起。然后,shell 可以更新作业的状态并告诉您它已暂停。
$ sleep 100 | sleep 200 & # start job in background: two sleep processes
[1] 18657 18658
$ ps -lj # note the PGID
F S UID PID PPID PGID SID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 10031 18657 26500 18657 26500 0 85 5 - 2256 - pts/2 00:00:00 sleep
0 S 10031 18658 26500 18657 26500 0 85 5 - 2256 - pts/2 00:00:00 sleep
0 R 10031 18692 26500 18692 26500 0 80 0 - 2964 - pts/2 00:00:00 ps
0 S 10031 26500 26498 26500 26500 0 80 0 - 10775 - pts/2 00:00:01 zsh
$ jobs -p
[1] + 18657 running sleep 100 |
running sleep 200
$ fg
[1] + running sleep 100 | sleep 200
^Z
zsh: suspended sleep 100 | sleep 200
$ jobs -p
[1] + 18657 suspended sleep 100 |
suspended sleep 200
$ ps -lj # note the "T" under the S column
F S UID PID PPID PGID SID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 T 10031 18657 26500 18657 26500 0 85 5 - 2256 - pts/2 00:00:00 sleep
0 T 10031 18658 26500 18657 26500 0 85 5 - 2256 - pts/2 00:00:00 sleep
0 R 10031 18766 26500 18766 26500 0 80 0 - 2964 - pts/2 00:00:00 ps
0 S 10031 26500 26498 26500 26500 0 80 0 - 10775 - pts/2 00:00:01 zsh
$ bg %1
[1] + continued sleep 100 | sleep 200
$ ps -lj
F S UID PID PPID PGID SID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 10031 18657 26500 18657 26500 0 85 5 - 2256 - pts/2 00:00:00 sleep
0 S 10031 18658 26500 18657 26500 0 85 5 - 2256 - pts/2 00:00:00 sleep
0 R 10031 18824 26500 18824 26500 0 80 0 - 2964 - pts/2 00:00:00 ps
0 S 10031 26500 26498 26500 26500 0 80 0 - 10775 - pts/2 00:00:01 zsh