系统何时向进程发送 SIGTERM?

mic*_*con 32 linux process signals busybox

我的服务器程序收到一个 SIGTERM 并停止(退出代码为 0)。我对此感到惊讶,因为我很确定它有足够的内存。linux (busybox) 在什么情况下会向进程发送 SIGTERM?

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,则其他某个进程发送了该信号。

¹粗略地说

  • 很好地解释了如何在收到信号时确定退出状态。然而,这个答案并没有解决OP的问题。 (2认同)
  • @CharlieParker HPC 集群可能会监视进程并杀死那些它认为过度使用资源的进程。您必须查看集群的文档或询问管理员。 (2认同)

Sté*_*las 18

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

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

这是默认情况下由kill, pkill, killall... 命令发送的信号。

这是发送给守护进程以停止它们的信号(例如在 a 上service some-service stop),或者init在关闭之前发送(对于那些没有在 SIGTERM 上及时终止的进程,随后是 SIGKILL)。

请注意,SIGTERM不是在 上发送的信号^C。发送的信号^C是 SIGINT。

  • @CharlieParker,您需要确定哪个进程正在将该 SIGTERM 发送到运行“python”解释器的进程来解释您的脚本。系统日志可能包含一些信息。如果在 Linux 上,你可以使用 `auditd`/`auditctl` 来记录 `kill`/`tkill`/`tgkill` 系统调用的调用。 (2认同)