5

所以我最近了解到kill 不是同步命令,所以我在 bash 中使用了这个 while 循环,这太棒了:

while kill PID_OF_THE_PROCESS 2>/dev/null; do sleep 1; done

但是,在某些情况下(非常罕见,但仍然会发生)进程被卡住,并且不会对终止信号起作用。在这些情况下,杀死应用程序的唯一方法是使用“ kill -9 ”。

所以我想知道,只有在循环达到第 10 次迭代时,如何在 bash 中修改上面的 while 循环以使用 -9 参数?

4

4 回答 4

2

正如其他用户所说....在使用这种残酷的方法之前,您必须解决阻塞的原因...无论如何...试试这个

#!/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
于 2013-02-25T12:58:20.783 回答
1

发送一次信号就足够了。

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
于 2013-02-25T12:49:48.547 回答
1

当然,使用柜台,但这有点笨拙。

您可能真正想要做的是0用作您的信号,这对进程没有任何作用,但让您检查进程是否仍然存在。(kill -0 $pid如果进程不存在,将返回非零退出状态。)然后,你知道,不要只是kill -9它。进程不会无缘无故地卡住,它们卡住是因为它们无法释放资源,例如发生网络或文件系统阻塞时。解决块,然后进程可以自行清理。

于 2013-02-25T12:45:57.087 回答
0

有几种方法可以实现这一点,但您确实要求修改现有循环,因此:

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
于 2013-02-25T13:03:24.713 回答