gpt4 book ai didi

linux - 如何获取一组后台命令的正确PID并杀死它?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:56:38 27 4
gpt4 key购买 nike

好的,就像在这个线程中一样,How to get PID of background process? ,我知道如何获取后台进程的PID。然而,我需要做的不止一项手术。

{
sleep 300;

echo "Still running after 5 min, killing process manualy.";
COMMAND COMMAND COMMAND

echo "Shutdown complete"
}&
PID_CHECK_STOP=$!
some stuff...
kill -9 $PID_CHECK_STOP

但它不起作用。看来我得到了一个糟糕的 PID 或者我无法杀死它。我试着运行 ps | grep sleep 和它给出的 pid 总是紧挨着我在 PID_CHECK_STOP 中得到的 pid。有没有办法让它工作?我可以用另一种方式包装这些命令,以便在需要时可以将它们全部杀死吗?

谢谢大家!

最佳答案

kill -9 在进程可以做任何之前终止进程,包括向其子进程发出退出信号。使用更温和的信号(kill 本身,发送一个 TERM,应该就足够了)。不过,您确实需要让进程通过 trap 命令明确指示其子进程退出(如果有的话)。

我假设 sleep 是真正命令的占位符。然而,sleep 很棘手,因为它会忽略任何信号直到它返回(即,它是不可中断的)。为了使您的示例工作,请将 sleep 本身置于后台并立即 wait 。当您终止“外部”后台进程时,它将中断 wait 调用,这将允许 sleep 也被终止。

{
trap 'kill $(jobs -p)' EXIT
sleep 300 & wait

echo "Still running after 5 min, killing process manualy.";
COMMAND COMMAND COMMAND

echo "Shutdown complete"
}&
PID_CHECK_STOP=$!
some stuff...
kill $PID_CHECK_STOP

更新:COMMAND COMMAND COMMAND 包含一个通过 sudo 运行的命令。要终止该进程,还必须通过 sudo 运行 kill。请记住,这样做将运行外部 kill 程序,而不是内置的 shell(两者之间几乎没有区别;内置的存在允许您在进程运行时终止进程已达到配额)。

关于linux - 如何获取一组后台命令的正确PID并杀死它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16963133/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com