bash:while循环中的计数器(kill和kill-9)

bash:while循环中的计数器(kill和kill-9),bash,scripting,while-loop,kill,kill-process,Bash,Scripting,While Loop,Kill,Kill Process,最近我学习了这个命令,所以我在bash中使用了这个while循环,这非常棒: while kill PID_OF_THE_PROCESS 2>/dev/null; do sleep 1; done 但是,在某些情况下(非常罕见,但仍然会发生),进程会被卡住,并且不会对终止信号起作用。在这些情况下,杀死应用程序的唯一方法是使用“kill-9” 所以我想知道,在bash中,如何修改上面的while循环,使其仅在循环达到第10次迭代时使用-9参数?当然,使用计数器,但这有点笨拙 您可能真正想做

最近我学习了这个命令,所以我在bash中使用了这个while循环,这非常棒:

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


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

当然,使用计数器,但这有点笨拙


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

发送一次信号就足够了

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

正如其他用户所说。。。。在使用这种残忍的方法之前,您必须修复阻塞的原因。。。无论如何试试这个

#!/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

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

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


你的问题是什么?你想知道如何计数吗?我想知道如何在bash中的while循环中使用计数器,我不懂bash。如果你想知道如何在bash中创建计数器,请不要提出关于
kill-9
的问题。这将严重搅浑局势,因为
kill-9
通常是个坏主意,在脚本中执行肯定是个坏主意。我认真考虑过这样做,但暴露一个更一般的问题(没有“kill”命令)将更难理解。。。因此,仅仅包括我想要使用的命令的示例,在一般化时很有意义,
killall
问题和这个问题解决了相同的问题。如果这不是一个骗局,那么这是一个对未来读者没有多大用处的过于狭隘的问题,应该基于这些理由予以关闭。对不起,你能详细阐述一下0信号吗?我还是不明白杀人和杀人的区别-0@knocte
kill-0
如果找到一个进程,它不会对进程做任何事情。它只是让你知道它就在那里。把它想象成ping进程以查看它是否仍然存在。但是如果它不存在,plain kill(不带-0)也会返回一个非零状态,因此这不会改善任何事情really@knocte在这种情况下,它并没有那么有用,但脚本本身的前提是不确定的,这就是为什么这个答案是关于如何避免使用
kill-9
。@知道最后一点要考虑的:如果你的SIGTERM在第一次迭代中成功地杀死了进程,但是另一个你不想杀死的无关进程却产生了相同的pid怎么办?我说的是第10次迭代,不是10秒,对吗,如果您将两个代码块合并在一个代码块中,我将向上投票:)进程的
PID\u应该是一个变量吗?这几乎就是我想要实现的!它只是缺少在之前的迭代中对“kill”的调用10th@knocte如果您发送SIGTERM一次,如果可以,它将终止。再发送9次是没有意义的。这可能是没有意义的,但我想确定。。。(这可能毫无意义,但不会造成任何伤害,对吧?)。。。只需将kill移动到循环中,如果count<10,您可以添加一个elif来终止N次迭代中的进程吗?