所以我最近了解到kill 不是同步命令,所以我在 bash 中使用了这个 while 循环,这太棒了:
while kill PID_OF_THE_PROCESS 2>/dev/null; do sleep 1; done
但是,在某些情况下(非常罕见,但仍然会发生)进程被卡住,并且不会对终止信号起作用。在这些情况下,杀死应用程序的唯一方法是使用“ kill -9 ”。
所以我想知道,只有在循环达到第 10 次迭代时,如何在 bash 中修改上面的 while 循环以使用 -9 参数?
所以我最近了解到kill 不是同步命令,所以我在 bash 中使用了这个 while 循环,这太棒了:
while kill PID_OF_THE_PROCESS 2>/dev/null; do sleep 1; done
但是,在某些情况下(非常罕见,但仍然会发生)进程被卡住,并且不会对终止信号起作用。在这些情况下,杀死应用程序的唯一方法是使用“ kill -9 ”。
所以我想知道,只有在循环达到第 10 次迭代时,如何在 bash 中修改上面的 while 循环以使用 -9 参数?
正如其他用户所说....在使用这种残酷的方法之前,您必须解决阻塞的原因...无论如何...试试这个
#!/bin/bash
i=0
PID_OF_THE_PROCESS="your pid you can set as you like"
# send it just once
kill $PID_OF_THE_PROCESS 2>/dev/null;
while [ $i -lt 10 ];
do
# still alive?
[ -d /proc/$PID_OF_THE_PROCESS ] || exit;
sleep 1;
i=$((i+1))
done
# 10 iteration loop and still alive? be brutal
kill -9 $PID_OF_THE_PROCESS
发送一次信号就足够了。
kill $PID 2>/dev/null
sleep 10;
if kill -0 $PID 2>/dev/null
kill -9 $PID
fi
对于您的反问:
c=0
while true; do
echo $c;
c=$((c+1));
if [ $c -eq 10 ]; then break; fi;
done
当然,使用柜台,但这有点笨拙。
您可能真正想要做的是0用作您的信号,这对进程没有任何作用,但让您检查进程是否仍然存在。(kill -0 $pid如果进程不存在,将返回非零退出状态。)然后,你知道,不要只是kill -9它。进程不会无缘无故地卡住,它们卡住是因为它们无法释放资源,例如发生网络或文件系统阻塞时。解决块,然后进程可以自行清理。
有几种方法可以实现这一点,但您确实要求修改现有循环,因此:
count=0
while kill PID_OF_THE_PROCESS 2>/dev/null
do
sleep 1;
(( count++ ))
if (( count > 9 ))
then
kill -9 PID_OF_THE_PROCESS 2>/dev/null
fi
done