我正在尝试编写一个强大的 bash 脚本,并在其中创建一个后台进程。在脚本的末尾,我想终止它。我有它的 PID。
我在想这样的事情
while [[ ps ef $PID ]] ; do
kill $PID
sleep 0.5
done
有什么更好的建议吗?这种方法可能存在什么问题吗?
答案1
反复终止进程的问题在于,新进程的创建会产生竞争条件。这种情况不太可能发生,但有可能在您休眠时,进程会退出,而新进程会以相同的 PID 启动。
为什么要反复终止该进程?如果是因为进程将退出,但在收到信号后可能需要一些时间才能退出,则可以使用wait
:
kill $PID
wait $PID
在理想的系统中,您永远不必重复kill
或问题kill -9 $PID
。如果确实需要,您可能需要考虑修复您正在运行的任何内容,这样您就不必这样做了。与此同时,您可能不会遇到竞争条件,您可以通过(比如说)在终止进程之前检查 /proc/$PID/ 的时间戳来防止这种情况。不过,这是糟糕的黑客行为。
答案2
kill $PID
对于推荐从到的步骤的每个人kill -9 $PID
,我必须提醒你kill -9 无用。
不不不。不要使用 kill -9。
它没有给这个过程一个机会来清理:
关闭套接字连接
清理临时文件
通知其子进程它要离开了
重置其终端特性
等等等等。
一般来说,发送 15,然后等待一两秒,如果不行,就发送 2,如果还不行,就发送 1。如果还不行,就删除该二进制文件,因为程序行为很糟糕!
不要使用kill -9。不要为了整理花盆而开出联合收割机。
现在,我不同意“删除二进制部分”,但进展似乎比仅仅删除二进制部分损害更小kill -9
。
我也同意对使用相同 PID 创建新进程时竞争条件的关注这里。
答案3
首先进行常规杀戮,睡眠 x 秒,然后如果它还在,则将其杀死 -9。此外,这确实看起来像是你遇到的一个奇怪情况,可能需要向我们解释更大的问题。
答案4
为什么不只是
kill -9 $PID