我在 Ubuntu 18 LTS 系统上并排运行一些任务。所以我通过运行在这些作业之间切换:
# command &
# fg
# fg -
我有时也使用Ctrl+Z将正在运行的作业发送到后台。
假设我的列表中有 3 个工作:
# jobs
[1]+ Stopped nano /etc/nginx/site-available/blog.conf
[2] Stopped top
[3]- Stopped nano script.sh
我可以在这些之间成功切换,但是当我kill
在这些上运行命令时,作业仍然显示在列表中。没有人被杀。为什么?
# kill %1
我再次列出,工作仍然存在:
# jobs
[1]+ Stopped nano /etc/nginx/site-available/blog.conf
[2] Stopped top
[3]- Stopped nano script.sh
PS:我可以用他们的进程ID杀死工作,但为什么不能用kill %1
?
这里有几点需要指出:
kill
不带任何参数将SIGTERM
信号发送到所需的进程或作业标识符。SIGTERM
可以被接收它的进程忽略。已停止的进程(
SIGSTOP
例如使用Ctrl+恢复z)无法执行任何操作(保存文件等)。当您在
kill
没有参数的情况下运行需要特定步骤才能关闭但不能(因为它已停止)的进程时,它不会响应SIGTERM
并忽略它。另一方面SIGKILL
,不能忽略,所以它会杀死进程。这就是为什么像这样的命令可以很好sleep
地终止,而像这样的程序却不能。kill %1
nano
如果你不能通过它的 PID 杀死进程,那么你就不能用它的作业标识符来杀死它。
要使用其作业标识符终止进程而不保存数据、关闭会话操作等,请使用:
kill
向进程发送信号编号 15(SIGTERM),在我们的例子中,进程可以忽略它,因为它已停止,并且可能拒绝在停止状态下侦听 SIGTERM。但是第 9 号信号(SIGKILL)是由内核发送的,它不关心进程是否可以听到。它只是强行结束它。