我目前正在开发一个项目,该项目具有守护进程,该进程查看任务队列,运行这些任务,然后收集有关这些任务的信息 . 在某些情况下,守护程序必须“杀死”任务,如果它运行时间太长 .
SIGTERM的解释是“终止信号”,但这并不是很有用 . 我想为此使用最合适的信号 .
什么是最合适的POSIX信号编号,用于告诉进程“你花了太多时间运行所以你现在需要停止”?
如果你掌控了孩子的过程,你可以随心所欲地做,但 SIGTERM 是这个的自我记录信号 . 它要求进程有礼貌地终止:进程选择如何处理信号并且可以在实际退出之前执行清理操作(或者可以忽略信号) .
SIGTERM
然后,杀死进程的标准方法是先发送 SIGTERM ;然后等待它以5秒的宽限期终止(如果终止可能需要很长时间,例如因为大量的磁盘I / O,则更长) . 如果宽限期已过期,请发送 SIGKILL . 这是 SIGTERM 的"hard"版本并且不容忽视,但也让整个过程无法整齐地清理 . 必须将发送 SIGKILL 视为子进程的问题并进行报告 .
SIGKILL
通常你会先将 SIGTERM 发送给一个进程 . 当这个过程重现这个信号时,它能够清理一些东西,然后自行终止:
kill -15 PID_OF_PROCESS # 15 means SIGTERM
您可以通过将 0 信号发送到它的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!
2 回答
如果你掌控了孩子的过程,你可以随心所欲地做,但
SIGTERM
是这个的自我记录信号 . 它要求进程有礼貌地终止:进程选择如何处理信号并且可以在实际退出之前执行清理操作(或者可以忽略信号) .然后,杀死进程的标准方法是先发送
SIGTERM
;然后等待它以5秒的宽限期终止(如果终止可能需要很长时间,例如因为大量的磁盘I / O,则更长) . 如果宽限期已过期,请发送SIGKILL
. 这是SIGTERM
的"hard"版本并且不容忽视,但也让整个过程无法整齐地清理 . 必须将发送SIGKILL
视为子进程的问题并进行报告 .通常你会先将
SIGTERM
发送给一个进程 . 当这个过程重现这个信号时,它能够清理一些东西,然后自行终止:您可以通过将
0
信号发送到它的pid来检查进程是否仍在运行 .但是,您在宽限期后终止自身,使用
SIGKILL
将其终止,此信号无法由进程处理,操作系统将立即终止进程 .