`trap`-ing Linux 信号 - SIGSTOP?

Kev*_*ith 4 linux signals

Docker文档注意以下(带代码)关于如何clean up在容器关闭时运行:

最后,如果您需要在关机时进行一些额外的清理,...,您可能需要确保ENTRYPOINT脚本接收到 Unix 信号,传递它们,然后再做一些工作

#!/bin/sh

trap "echo TRAPed signal" HUP INT QUIT KILL TERM

/usr/sbin/apachectl start
Run Code Online (Sandbox Code Playgroud)

我认为这trap会捕捉到一个KILL信号。但是,我在这篇文章中读到:

除了 SIGKILL 和 SIGSTOP 之外的所有信号都可以被进程拦截。

然而,另一篇文章指出:

有一种信号是您无法捕获的:SIGKILL 或信号 9。

是哪个?

Sha*_*esh 5

你无法捕捉到 SIGSTOP。您引用的页面有误。

是的,上面的脚本试图捕捉 KILL 信号。它失败。您可以使用以下脚本轻松验证这一点:

#!/bin/sh

echo "Running shell in pid $$"
trap "echo TRAPed signal" HUP INT QUIT KILL TERM STOP

sleep 20
Run Code Online (Sandbox Code Playgroud)

尝试向它发送 KILL 和 STOP 信号,您将看到进程分别终止和停止,而没有打印消息。如果您尝试任何其他捕获的信号,您将看到它们按预期处理。

  • 感谢您的回答。作为补充参考,[wikipedia](https://en.wikipedia.org/wiki/Unix_signal#Handling_signals) 指出:“有两个信号无法被拦截和处理:SIGKILL 和 SIGSTOP。” (2认同)