linux - bash 脚本杀死竞争条件

标签 linux bash shell process kill

我有一个调用 kill $PID 的 bash 脚本,然后等待 2 秒,如果 $PID 仍然存在(通过检查 ps ),它调用 kill -9 $PID 作为回退。据我所知,这是一个非常标准的终止进程的脚本,可以在网上的许多示例脚本中找到。

脚本运行良好(我不担心 PID 在这里重用),但今天我设法捕获了一个罕见的竞争条件,进程在 2 秒内仍然被杀死,并且 kill -9 挂起。这是 ps 输出:

root     17172  0.0  0.0   7920  1668 ?        S    Jul16   0:00 /bin/kill -9 16635
root     17173  0.0  0.0      0     0 ?        Z    Jul16   0:00 [kill] <defunct>

kill -9 挂起是因为它命中了一个不存在的进程(即来自之前的 kill),即 PID 16635 是已经被第一个 kill 杀死的进程.

如果我对 kill -9 进程 (PID 17172) 执行 kill -9,那么一切都很好。

无论如何,我是否可以首先阻止 "kill -9" 挂起?确保进程在 2 秒内被杀死是一种回退。我不想添加另一个背景检查来检查后备 kill -9

更新:

我能找到的最佳答案是在 kill -9 上使用超时命令:

timeout -s 9 2 kill -9 $PID

这将确保在 2 秒后,如果 kill -9 挂起,超时将在其上发出 kill -9

最佳答案

这可能是检查进程是否仍然存在以及是否应该发送 kill -9

的更好方法
kill [pid]
sleep 5
kill -0 [pid]
if [ $? -eq  0 ] ; then
  echo 'process not terminated'
  kill -9 [pid]
else
  echo 'process terminated'
fi

这使用通过 kill 发送信号来确保您有权向进程 kill -0 发送 kill 信号。这可能比检查 PID 是否仍然存在更好。然后,如果您确实有权访问该程序,则终止该程序。您唯一可以做的另一件事是进入更长的 sleep 时间或一些重要的事情,例如编写您自己的 kill 或检查进程状态等。

您还可以再做一次 sleep ,然后通过在大约 20 秒后查看 kill -9 是否仍然存在来检查竞争条件,然后终止该进程。这至少会缓解脚本的停顿,但不会解决竞争条件。

关于linux - bash 脚本杀死竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31455178/

相关文章:

linux - 拆分命令并将输出放入特定的模式文件

bash - 使用 bash 变量将参数传递给 perl

mysql - 如何使用shell脚本检查MySQL数据库中是否存在表?

powershell - 某些命令(例如 IISRESET 和 ROBOCOPY)已在 Powershell v4 中停止工作

java - .NET/Mono 还是 Java 是跨平台开发的更好选择?

linux - 在 Linux 中是否有标准调用来解析 inode 的路径名?

linux - 向所有使用 Wall 的人广播用户消息

windows - 我如何在 linux bash 中恢复 windows chk 文件扩展

linux - 如何在 ssh linux 中运行多个命令

linux - 如何测试变量是否是 Bash 中的数字?