Amandasaurus Asked: 2009-07-24 07:39:50 +0800 CST2009-07-24 07:39:50 +0800 CST 2009-07-24 07:39:50 +0800 CST 用于杀死进程直到死亡的 Bash 片段? 772 我正在尝试编写一个强大的 bash 脚本,并在其中创建一个后台进程。在脚本的最后,我想杀死它。我有它的PID。 我在想这样的事情 while [[ ps ef $PID ]] ; do kill $PID sleep 0.5 done 有什么更好的建议吗?这种方法有什么可能的问题吗? scripting bash process kill snippet 5 个回答 Voted Best Answer Andrew Aylett 2009-07-24T08:18:55+08:002009-07-24T08:18:55+08:00 重复杀死一个进程的问题是你有一个新进程创建的竞争条件。这不是特别有可能,但有可能该进程将退出,并且在您睡觉时以相同的 PID 启动一个新进程。 为什么您必须反复终止该进程?如果是因为进程将退出,但收到信号后可能需要一段时间才能退出,您可以使用wait: kill $PID wait $PID 在理想的系统中,您永远不必重复 akill或 issue kill -9 $PID。如果您必须这样做,您可能需要考虑修复您正在运行的任何内容,这样您就不必这样做了。同时,您可能不会遇到竞争条件,您可以通过(例如)在终止进程之前检查 /proc/$PID/ 的时间戳来防止它发生。不过,这很糟糕。 Adriano Varoli Piazza 2009-07-24T09:16:29+08:002009-07-24T09:16:29+08:00 对于每个推荐 from kill $PIDto步骤的人kill -9 $PID,我不得不提醒你对 kill -9 的无用使用。 不不不。不要使用 kill -9。 它没有给过程一个干净的机会: 关闭套接字连接 清理临时文件 通知它的孩子它正在消失 重置其终端特性 等等等等等等。 通常,发送 15,然后等待一两秒钟,如果不起作用,发送 2,如果不起作用,发送 1。如果不起作用,请删除二进制文件,因为程序表现不佳! 不要使用 kill -9。不要为了收拾花盆而拿出联合收割机。 现在,我不同意“删除二进制部分”,但进展似乎比kill -9. 我也同意这里提到的关于创建具有相同 PID 的新进程的竞争条件的关心。 Kyle Brandt 2009-07-24T07:49:03+08:002009-07-24T07:49:03+08:00 首先进行正常的杀戮,睡眠 x 秒,然后杀 -9 如果它还在的话。此外,这似乎是您遇到的奇怪情况,可能想向我们解释更大的问题。 Brent 2009-07-24T07:50:17+08:002009-07-24T07:50:17+08:00 通常你想先尝试kill $PID, 然后让它睡一会儿,看看它是否会优雅地退出。 如果没有,则执行kill -9 $PID强制摆脱它。 chris 2009-07-24T07:47:08+08:002009-07-24T07:47:08+08:00 为什么不只是 kill -9 $PID
重复杀死一个进程的问题是你有一个新进程创建的竞争条件。这不是特别有可能,但有可能该进程将退出,并且在您睡觉时以相同的 PID 启动一个新进程。
为什么您必须反复终止该进程?如果是因为进程将退出,但收到信号后可能需要一段时间才能退出,您可以使用
wait
:在理想的系统中,您永远不必重复 a
kill
或 issuekill -9 $PID
。如果您必须这样做,您可能需要考虑修复您正在运行的任何内容,这样您就不必这样做了。同时,您可能不会遇到竞争条件,您可以通过(例如)在终止进程之前检查 /proc/$PID/ 的时间戳来防止它发生。不过,这很糟糕。对于每个推荐 from
kill $PID
to步骤的人kill -9 $PID
,我不得不提醒你对 kill -9 的无用使用。现在,我不同意“删除二进制部分”,但进展似乎比
kill -9
.我也同意这里提到的关于创建具有相同 PID 的新进程的竞争条件的关心。
首先进行正常的杀戮,睡眠 x 秒,然后杀 -9 如果它还在的话。此外,这似乎是您遇到的奇怪情况,可能想向我们解释更大的问题。
通常你想先尝试
kill $PID
,然后让它睡一会儿,看看它是否会优雅地退出。
如果没有,则执行
kill -9 $PID
强制摆脱它。为什么不只是
kill -9 $PID