![使用终端杀死 shell](https://linux22.com/image/998626/%E4%BD%BF%E7%94%A8%E7%BB%88%E7%AB%AF%E6%9D%80%E6%AD%BB%20shell.png)
echo $$
它告诉 shell 的 PID。因此,如果我使用以下命令终止此 shell
kill 123 #suppose 123 is PID of shell
实际上什么也没发生,我试过了。我再次运行
echo $$
并且 shell 在相同的 PID 下运行。为什么 shell 没有停止?如果 shell 被终止会发生什么?
答案1
主要原因是 shell 是为了捕获TERM
信号而构建的。此行为是有记录的。引用 bash 4.3 手册:
信号
当 bash 处于交互状态时,如果没有任何陷阱,它会忽略 SIGTERM(因此 kill 0 不会终止交互 shell),并且会捕获和处理 SIGINT(因此 wait 内置命令是可中断的)。在所有情况下,bash 都会忽略 SIGQUIT。如果作业控制有效,bash 会忽略 SIGTTIN、SIGTTOU 和 SIGTSTP。
从man kill
:
终止的默认信号是 TERM。
现在,如果您指定kill -KILL $$
,什么确实会杀死您的 shell,并且一旦控制 shell 退出 - 这将关闭终端。选项-9
、-KILL
和-SIGKILL
都是同一kill
信号的别名,这就是这三个中的任何一个都可以工作的原因,并且是 Siguza 在评论中指出的别名之一。
与 M. Becerra 所说的相反,这与窗口本身无关,因为窗口 PID 总是与 shell 的不同:
# Shell PID
$ cat /proc/self/status | grep '^Pid:'
Pid: 7058
$ echo $$
14709
# GUI window PID
$ xdotool getactivewindow getwindowpid
2774