系统何时将SIGTERM发送到进程?


24

我的服务器程序收到SIGTERM并停止了(退出代码为0)。我对此感到惊讶,因为我可以肯定它有足够的存储空间。linux(busybox)在什么条件下将SIGTERM发送到进程?


我想不出内核或标准工具将SIGTERM发送到随机进程的任何情况。您能告诉我们有关程序的功能以及如何启动的信息吗?您如何得知程序的退出状态?您能重现问题吗?您有可以检查的日志吗?
吉尔(Gilles)'所以

它正在读取和写入串行线,并且正在响应UDP和TCP请求。我将执行包装在bash脚本上,因此我知道退出代码。
michelemarcon 2011年

1
Posix文档表明SIGTERM严格来说是用户级别的事件。是否有其他人可以杀死您的服务器程序?
剥壳机2011年

3
你是!返回代码0表示正常退出。如果有SIGTERM,$?则将其设置为143(128 +信号编号)。
吉尔(Gilles)'所以

1
此外,^ C是SIGINT,不SIGTERM,这将具有的130码退出
flarn2006

Answers:


13

我将其发布为答案,以便在出现问题的情况下采取某种解决方案。

退出状态为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,则其他进程发送该信号。

¹ 粗略地说


很好的解释了如何在收到信号后确定退出状态。但是,此答案不能解决OP的问题。
codeforester

1
@codeforester我在正文中回答了问题,而不是标题中的问题。好吧,体内的一个问题-鉴于它是基于一种误解,所以有点混乱。我将补充一些其他内容。
吉尔斯(Gillles)“所以-别再作恶了”

这取决于外壳。在ksh93的,它是256 +正负号,在佳日,它是384 +正负号
斯特凡Chazelas

请注意,使用大于256的值不一定会更好,因为这样会阻止将其传递给exit。该yash方法是一个很好的折衷方案,但另请参见rc。另请参见进程终止时的默认退出代码?
斯特凡Chazelas

10

SIGTERM是通常用于管理性终止进程的信号。

这不是内核要发送的信号,而是一个进程通常发送的(终止)另一个进程的信号。

这是在默认情况下被发送的信号killpkillkillallfuser -k...命令。

这是发送到守护程序以停止它们的信号(如上的service some-service stop),或者是init在关闭之前发送的信号(对于未设法在SIGTERM上及时终止的进程,紧接着是SIGKILL)。

注意SIGTERM 不是发送的信号^C。发送的信号^C是SIGINT。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.