使用适当的POSIX信号

时间:2014-02-18 14:22:56

标签: linux signals posix

我目前正在开发一个项目,该项目具有守护进程,该进程查看任务队列,运行这些任务,然后收集有关这些任务的信息。在某些情况下,守护进程必须“杀死”任务,如果它运行时间太长。

SIGTERM的解释是“终止信号”,但这并不是很有用。我想为此使用最合适的信号。

用于告诉流程的最合适的POSIX信号编号“你花了太多时间运行所以你现在需要停止”?

2 个答案:

答案 0 :(得分:2)

如果你掌控了孩子的过程,你几乎可以随意做,但SIGTERM是自我记录的信号。它要求进程有礼貌地终止:进程选择如何处理信号,并可能在实际退出之前执行清理操作(或者可能忽略信号)。

杀死进程的标准方法是首先发送SIGTERM;然后等待它以5秒的宽限期终止(如果终止可能需要很长时间,例如因为大量的磁盘I / O,则更长)。如果宽限期已过期,请发送SIGKILL。这是SIGTERM的“硬”版本,不容忽视,但也让整个过程无法整齐地清理。必须将发送SIGKILL视为子进程的问题并以此方式进行报告。

答案 1 :(得分:1)

通常,您首先会将SIGTERM发送给流程。当该过程重现这个信号时,它能够清理一些东西然后自行终止:

kill -15 PID_OF_PROCESS # 15 means SIGTERM

您可以通过向其pid发送0信号来检查进程是否仍在运行。

kill -0 PID_OF_PROCESS # 0 means 0 :)
if [ "$?" == "0" ] ; then
    echo "the process is still running"
fi

但是,您需要一些宽限期才能让流程清理完毕。如果进程在宽限期后没有自行终止,则使用SIGKILL将其终止。进程无法处理此信号,操作系统将立即终止进程。

kill -9 PID_OF_PROCESS # 9 means SIGKILL, means DIE!