我的服务器程序收到SIGTERM并停止了(退出代码为0)。我对此感到惊讶,因为我可以肯定它有足够的存储空间。linux(busybox)在什么条件下将SIGTERM发送到进程?
$?
则将其设置为143(128 +信号编号)。
我的服务器程序收到SIGTERM并停止了(退出代码为0)。我对此感到惊讶,因为我可以肯定它有足够的存储空间。linux(busybox)在什么条件下将SIGTERM发送到进程?
$?
则将其设置为143(128 +信号编号)。
Answers:
我将其发布为答案,以便在出现问题的情况下采取某种解决方案。
退出状态为0表示从成功的程序正常退出。一个退出程序可以选择作为其退出状态0和255之间的任意整数。按照惯例,程序使用较小的值。Shell使用值126及更高的值来报告特殊情况,因此最好避免使用它们。
在C API级别,程序报告一个16位状态¹,该状态对程序的退出状态和杀死该程序的信号(如果有)进行编码。
在外壳程序中,命令的退出状态(保存在中$?
)使程序的实际退出状态与信号值合为一体:如果程序被信号杀死,$?
则将其设置为大于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,则其他进程发送该信号。
¹ 粗略地说