Bash snippet杀死一个进程,直到死了?

我试图写一个强大的bash脚本,并在其中创build一个后台进程。 脚本结尾,我想杀了它。 我有它的PID。

我正在想这样的事情

while [[ ps ef $PID ]] ; do kill $PID sleep 0.5 done 

任何build议任何更好的? 这种方法的任何可能的问题?

重复杀死一个进程的问题是,你有一个新的进程创build的竞争条件。 这不是特别有可能,但是当你睡觉的时候,这个过程可能会退出并且有一个新的进程以相同的PID启动。

为什么你不得不反复杀死这个过程? 如果因为进程退出,但收到信号后可能需要一些时间才能退出,可以使用wait

  kill $PID wait $PID 

在一个理想的系统中,你不必重复kill或者kill -9 $PID 。 如果你需要的话,你可能要考虑修理你正在运行的任何东西,所以你不需要。 与此同时,你可能不会遇到竞争条件,你可以通过(比如)检查/ proc / $ PID /的时间戳来阻止它。 虽然这很糟糕。

对于大家推荐从kill $PIDkill -9 $PID ,我不得不提醒你无用的使用kill -9 。

不不不。 不要使用kill -9。

它并没有给这个过程一个干净的机会:

  1. closures套接字连接

  2. 清理临时文件

  3. 通知它的孩子,它正在消失

  4. 重置其terminal特性

依此类推等等。

一般情况下,发送15,然后等待一两秒钟,如果这样做不起作用,发送2,如果不起作用,发送1.如果不行,请删除二进制文件,因为程序performance不好!

不要使用kill -9。 不要拿出联合收割机来收拾花盆。

现在,我不同意“删除二进制部分”,但是进展似乎不如kill -9那么有害。

我也同意在这里提到的使用相同的PID创build新stream程的关注竞争条件。

首先做正常的杀,睡眠x秒,然后杀死它,如果它仍然在附近。 而且,这看起来像是一个奇怪的情况,你可能想向我们解释一个更大的问题。

通常你想尝试先kill $PID

然后让它睡一下,看看它是否会优雅地退出。

如果没有,那么执行kill -9 $PID来强制摆脱它。

为什么不呢

kill -9 $PID