Gil*_*il' 27
我会将此作为答案发布,以便在结果证明这是问题时有某种解决方案。
退出状态 0 表示从成功的程序中正常退出。一个退出程序可以选择作为其退出状态0和255之间的任意整数。通常,程序使用较小的值。外壳程序使用 126 及以上的值来报告特殊情况,因此最好避免使用它们。
在 C API 级别,程序报告一个 16 位状态¹,该状态对程序的退出状态和杀死它的信号(如果有)进行编码。
在shell中,一个命令的退出状态(保存$?
)就合并程序的实际退出状态和信号值:如果一个程序是由信号杀害,$?
被设置为一个值大于128(与大多数壳,这个值是128+信号数;ATT ksh使用256+信号数,yash使用384+信号数,避免了歧义,但其他shell没有效仿)。
特别是如果$?
是0,你的程序就正常退出了。
请注意,这包括接收 SIGTERM 但具有信号处理程序并最终正常退出的进程的情况(可能是 SIGTERM 信号的间接结果,也可能不是)。
要回答标题中的问题,系统永远不会自动发送 SIGTERM。有一些信号会在终端离开时自动发送,例如 SIGHUP,当进程执行不应该做的事情时发送 SIGSEGV/SIGBUS/SIGILL,当它写入损坏的管道/套接字时发送 SIGPIPE,等等。还有由于终端中的按键按下而发送的一些信号,主要是 SIGINT 用于Ctrl+ C, SIGQUIT 用于Ctrl+\和 SIGTSTP 用于Ctrl+ Z,但 SIGTERM 不是其中之一。如果一个进程收到 SIGTERM,则其他某个进程发送了该信号。
¹粗略地说
Sté*_*las 18
SIGTERM 是通常用于以管理方式终止进程的信号。
这不是内核会发送的信号,而是一个进程通常会发送的信号以终止(优雅地)另一个进程。
这是默认情况下由kill
, pkill
, killall
... 命令发送的信号。
这是发送给守护进程以停止它们的信号(例如在 a 上service some-service stop
),或者init
在关闭之前发送(对于那些没有在 SIGTERM 上及时终止的进程,随后是 SIGKILL)。
请注意,SIGTERM不是在 上发送的信号^C
。发送的信号^C
是 SIGINT。