我目前正在开发一个项目,该项目具有守护进程,该进程查看任务队列,运行这些任务,然后收集有关这些任务的信息。在某些情况下,守护进程必须“杀死”任务,如果它运行时间太长。
SIGTERM的解释是“终止信号”,但这并不是很有用。我想为此使用最合适的信号。
用于告诉流程的最合适的POSIX信号编号“你花了太多时间运行所以你现在需要停止”?
答案 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!