可以在进程运行期间暂停进程,而无需终止它。尽管有时这可能会比较危险(比如,脚本打开了一个关键的系统文件的文件锁),但通常它可以在不终止进程的情况下使你能够深入脚本内部一窥究竟。
Ctrl+Z组合键会生成一个SIGTSTP信号,停止shell中运行的任何进程。停止(stopping)进程跟终止(terminating)进程不同:停止进程会让程序继续保留在内存中,并能从上次停止的位置继续运行。在16.4节中,你会了解如何重启一个已经停止的进程。
当用Ctrl+Z组合键时,进程被停止。

$ sleep 100
^Z 
[1]+ Stopped sleep 100 
$ 

方括号中的数字是shell分配的作业号(job number)。shell将shell中运行的每个进程称为作业,并为每个作业分配唯一的作业号。它会给第一个作业分配作业号1,第二个作业号2,以此类推。如果shell会话中有一个已停止的作业,在退出shell时,bash会提醒你。

$ sleep 100
^Z 
[1]+ Stopped sleep 100 
$ exit 
exit 
There are stopped jobs. 
$ 

可以用ps命令来查看已停止的作业。

$ sleep 100
^Z 
[1]+ Stopped sleep 100 
$ 
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 
0 S 501 2431 2430 0 80 0 - 27118 wait pts/0 00:00:00 bash 
0 T 501 2456 2431 0 80 0 - 25227 signal pts/0 00:00:00 sleep 
0 R 501 2458 2431 0 80 0 - 27034 - pts/0 00:00:00 ps 
$ 

在S列中(进程状态),ps命令将已停止作业的状态为显示为T。这说明命令要么被跟踪,要么被停止了。
如果在有已停止作业存在的情况下,你仍旧想退出shell,只要再输入一遍exit命令就行了。
shell会退出,终止已停止作业。或者,既然你已经知道了已停止作业的PID,就可以用kill命令来发送一个SIGKILL信号来终止它。

$ kill -9 2456
$ 
[1]+ Killed sleep 100 
$ 

在终止作业时,最开始不会得到任何回应。但下次如果你做了能够产生shell提示符的操作(比如按回车键),就会看到一条消息,显示作业已经被终止了。每当shell产生一个提示符时,它就会显示shell中状态发生改变的作业的状态。在终止一个作业后,下次强制shell生成一个提示符时,shell会显示一条消息,说明作业在运行时被终止了。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐