使用适当的POSIX信号

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

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

什么是用于告诉流程的最适合的POSIX信号编号?“您花费了太多时间运行,因此您需要立即停止”?


如果你控制着孩子的过程,你几乎可以SIGTERM ,但是SIGTERM就是这种自我记录的信号。 它要求一个过程终止,礼貌地:过程选择如何处理信号,并可能在实际退出之前执行清除操作(或可能忽略该信号)。

杀死进程的标准方法是首先发送一个SIGTERM ; 然后等待它以例如5秒的宽限期终止(如果终止可能需要很长时间(例如,由于大量的磁盘I / O),则更长)。 如果宽限期已过,请发送SIGKILL 。 这是SIGTERM的“硬”版本,不容忽视,但也使得整个过程没有机会整齐地进行清理。 发送一个SIGKILL应该被认为是子进程的一个问题,并且被报告为这样。


通常你会首先发送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!
链接地址: http://www.djcxy.com/p/50023.html

上一篇: Using appropriate POSIX signals

下一篇: How are asynchronous signal handlers executed on Linux?