某些进程会一直存活(如 init),而某些进程会以新的形式重生(如您的 shell)。最终大多进程都会因自然原因(即程序运行结束)而消亡。
此外,您还可以将某个进程放在一个挂起的动作序列中,等待被再次激活。正如先前的示例所示,您可以用 kill 提前终止某个进程。
当某个命令在前台运行时,如果您希望将它挂起,请按 Ctrl + Z:
$ sleep 10
(Press Control-Z)
[1]+ Stopped sleep 10
$ ps
PID PPID USER COMMAND S STIME TIME
18195 16351 mstreic sleep 10 T 12:44 00:00:00
Shell 已将命令挂起,为了方便起见,还为它分配了一个标签。您可以像先前那样使用这个标签,以终止工作或让工作返回前台。您还可以使用 bg 命令在后台恢复这个进程:
bg %1
[1]+ sleep 10 &
当某个命令在前台运行时,如果您想终止它,请按 Ctrl + C:
$ sleep 10
(Press Control-C
$ jobs
$
您的 Shell 能使进程的挂起和终止变得更容易,但在 Shell 单纯的外表下,却隐藏着复杂的一面。在内部,Shell 使用 Unix 信号来影响进程的状态。信号是一个事件,它被用来向某个进程发出警报。操作系统生成许多信号,但您可以将信号从一个进程发送到另一个进程,甚至能让某个进程给自己发送信号。
UNIX 包括多种信号,它们大多都有特殊目的。例如,如果您将信号 SIGSTOP 发送到某个进程,该进程将挂起。(要获取信号的完整列表,请键入 man 7 signal 或键入 kill -L)。您可以用 kill 命令发送信号。
$ sleep 20 &
[1] 19988
$ kill -SIGSTOP 19988
$ jobs
[1]+ Stopped sleep 20
起初,sleep 命令在后台启动,其进程 ID 为 19988。在发送 SIGSTOP 之后,该进程会改变状态,变为挂起或停止。发送另一个信号 SIGCONT,重新激活进程,该进程将从上次停止的地方继续执行。
标签: