簡體   English   中英

bash:在while循環中反擊(kill和kill -9)

[英]bash: counter inside a while loop (kill and kill -9)

所以我最近了解到kill不是同步命令,所以我在bash中使用while循環,這很棒:

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

但是,有些情況(非常罕見,但它們仍然會發生),其中進程被卡住,並且它不會對kill信號起作用。 在這些情況下,殺死應用程序的唯一方法是使用“ 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

當然,使用一個櫃台,但這有點火腿。

您可能真正想要做的是使用0作為您的信號,這對過程無效,但讓您檢查過程是否仍然存在。 (如果進程不存在, kill -0 $pid將返回非零退出狀態。)然后,你知道,不要只是kill -9它。 進程不會無緣無故地卡住,它們會因為無法釋放資源而陷入困境,例如發生網絡或文件系統阻塞時。 解決塊,然后該過程可以自行清理。

一次發送信號就足夠了。

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

有幾種方法可以實現這一點,但您確實要求修改現有的循環,因此:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM