0

应该如何看待向进程/PID 发送终止信号的 Linux 命令,如果它在 10 秒后无法正常退出,则终止它?

我的尝试是:“sudo timeout -vk 5 10 kill PIDhere”(-v 详细,X 秒后 -k kill)但我不确定它是否好或如何调整值,或者是否有更好的命令甚至可以使用进程 COMMAND 行中显示的名称的一部分。(“ps aux”输出)

4

1 回答 1

0
sudo timeout -vk 5 10 kill PIDhere

将执行,然后如果花费时间过长kill,则尝试终止该进程。这不应该发生,并且可能不是您想要的(如果kill实际上是挂起,杀死它不会影响您的实际过程)。timeout对于限制进程运行的时间非常有用,而不是在接收到信号后终止需要多长时间。

相反,我建议异步启动进程(例如&,在 shell 中使用,但任何语言的子进程库都将具有类似的功能),然后在发送信号后等待进程终止。我在这个答案中描述了用 Java 执行此操作。在外壳中可能看起来像:

$ some_process &
# time passes, eventually we decide to terminate the process
$ kill %1
$ sleep 5s
$ kill -s SIGKILL %1 # will fail and do nothing if %1 has already finished

或者,如果作业在完成之前终止,您可以依赖waitwhich 将提前返回sleep

$ some_process &
# time passes
$ kill %1
$ sleep 5s &
$ wait -n %1 %2       # returns once %1 or %2 (sleep) complete
$ kill -s SIGKILL %1  # if %2 completes first %1 is still running and will be killed

您可以使用 PID 而不是作业 ID 执行与上述相同的操作,只是有点繁琐,因为您必须担心 PID 重用。

如果有更好的命令甚至可以使用部分名称

pkill你想做的事吗?

于 2022-02-24T03:23:56.713 回答