Linux 使用适当的POSIX信号

Linux 使用适当的POSIX信号,linux,signals,posix,Linux,Signals,Posix,我目前正在从事一个项目,该项目有一个守护进程,可以查看任务队列,运行这些任务,然后收集有关这些任务的信息。在某些情况下,如果任务运行时间过长,守护进程必须“杀死”该任务 SIGTERM的解释是“终止信号”,但这不是很有用。我想使用最合适的信号 最合适的POSIX信号号是什么,用于告诉进程“你花了太多的时间运行,所以现在需要停止”如果你控制子进程,你几乎可以随心所欲,但是SIGTERM是这方面的自我记录信号。它礼貌地要求进程终止:进程选择如何处理信号,并可能在实际退出之前执行清理操作(或忽略信号)

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

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


最合适的POSIX信号号是什么,用于告诉进程“你花了太多的时间运行,所以现在需要停止”

如果你控制子进程,你几乎可以随心所欲,但是
SIGTERM
是这方面的自我记录信号。它礼貌地要求进程终止:进程选择如何处理信号,并可能在实际退出之前执行清理操作(或忽略信号)


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

如果您控制子进程,您可以随意执行,但是
SIGTERM
是这方面的自我记录信号。它礼貌地要求进程终止:进程选择如何处理信号,并可能在实际退出之前执行清理操作(或忽略信号)


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

如果您控制子进程,您可以随意执行,但是
SIGTERM
是这方面的自我记录信号。它礼貌地要求进程终止:进程选择如何处理信号,并可能在实际退出之前执行清理操作(或忽略信号)


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

如果您控制子进程,您可以随意执行,但是
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!

通常,您将首先向进程发送
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!

通常,您将首先向进程发送
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!

通常,您将首先向进程发送
SIGTERM
。当进程接收到该信号时,它能够清理一些东西,然后自行终止:

kill -15 PID_OF_PROCESS # 15 means SIGTERM
您可以通过发送
0
si来检查进程是否仍在运行