我试图写一个强大的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 $PID到kill -9 $PID ,我不得不提醒你无用的使用kill -9 。
不不不。 不要使用kill -9。
它并没有给这个过程一个干净的机会:
closures套接字连接
清理临时文件
通知它的孩子,它正在消失
重置其terminal特性
依此类推等等。
一般情况下,发送15,然后等待一两秒钟,如果这样做不起作用,发送2,如果不起作用,发送1.如果不行,请删除二进制文件,因为程序performance不好!
不要使用kill -9。 不要拿出联合收割机来收拾花盆。
现在,我不同意“删除二进制部分”,但是进展似乎不如kill -9那么有害。
我也同意在这里提到的使用相同的PID创build新stream程的关注竞争条件。
首先做正常的杀,睡眠x秒,然后杀死它,如果它仍然在附近。 而且,这看起来像是一个奇怪的情况,你可能想向我们解释一个更大的问题。
通常你想尝试先kill $PID ,
然后让它睡一下,看看它是否会优雅地退出。
如果没有,那么执行kill -9 $PID来强制摆脱它。
为什么不呢
kill -9 $PID