2013-02-25 33 views
5

Więc nauczyłem się niedawno, że polecenia kill is not a synchronous, więc używam tej pętli while w bash, który jest niesamowite:bash: licznik wewnątrz pętli while (zabić i kill -9)

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

jednak , są przypadki (bardzo rzadkie, ale wciąż się zdarzają), w których proces utknął i nie działa on na sygnał zabicia. W takich przypadkach jedynym sposobem na zabicie aplikacji jest "kill -9".

Zastanawiam się, w jaki sposób zmodyfikować pętlę while powyżej, w bashu, aby użyć argumentu -9 tylko wtedy, gdy pętla osiągnęła 10. iterację?

+0

jakie jest twoje pytanie? Chcesz wiedzieć, jak liczyć? –

+0

Chcę wiedzieć, jak używać licznika wewnątrz pętli while w bashie, nie jestem bashiem literackim – knocte

+2

Jeśli chcesz wiedzieć, jak utworzyć licznik w bashu, nie rób pytania o 'kill -9'. To poważnie zmąci wody, ponieważ 'kill -9' jest zwykle złym pomysłem i * zdecydowanie * jest to zły pomysł w scenariuszu. – kojiro

Odpowiedz

1

Jasne, użyj blatu, ale to trochę zaciśnięte.

Co naprawdę chcesz zrobić, to użyć 0 jako sygnału, który nie będzie działał w tym procesie, ale pozwoli ci sprawdzić, czy proces wciąż jest żywy. (kill -0 $pid zwróci niezerowy status wyjścia, jeśli proces nie istnieje.) A następnie, wiesz, nie tylko kill -9 go. Procesy nie utknęły bez powodu, utknęły, ponieważ nie mogły zwolnić zasobu, na przykład w przypadku zablokowania sieci lub systemu plików. Rozwiąż blok, a następnie proces może sam się posprzątać.

+0

Przepraszam, czy możesz rozwinąć nieco więcej o sygnale 0? Nadal nie dostaję różnicy między zabiciem a zabiciem -0 – knocte

+0

@knocte 'kill -0' nie robi nic dla procesu, jeśli go znajdzie. Po prostu daje ci znać, że tam jest. Pomyśl o tym, jak pingowanie procesu, aby sprawdzić, czy wciąż żyje. – kojiro

+0

ale zwykły kill (bez -0) zwraca również status niezerowy, jeśli nie istnieje, więc to nie poprawia niczego tak naprawdę – knocte

1

Wystarczy wysłać sygnał jeden raz.

kill $PID 2>/dev/null 
sleep 10; 
if kill -0 $PID 2>/dev/null 
    kill -9 $PID 
fi 

Dla licznika pytanie:

c=0 
while true; do 
    echo $c; 
    c=$((c+1)); 
    if [ $c -eq 10 ]; then break; fi; 
done 
+0

Powiedziałem, że 10-ta iteracja, a nie 10 sekund – knocte

+0

zaktualizowano ........ –

+0

w porządku, jeśli połączysz oba bloki kodu w jednym, pobiorę się :) – knocte

2

Jak inni użytkownicy powiedział .... trzeba ustalić przyczynę bloku przed użyciem tej metody brutalne ... tak ... Spróbuj tego

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

"PID_OF_THE_PROCESS" ma być zmienna? – kojiro

+0

to prawie to, co chcę osiągnąć! brakuje tylko połączenia do "zabicia" w poprzednich iteracjach przed 10-ty – knocte

+0

@knocte, jeśli wyślesz SIGTERM raz, zakończy się, jeśli to możliwe. Przesłanie go jeszcze 9 razy nie ma sensu. – kojiro

0

Istnieje kilka sposobów, aby to osiągnąć, ale pytałem zmodyfikować istniejącą pętlę, więc:

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 
+0

możesz po prostu dodać elif, aby zabić proces w iteracji N, jeśli liczyć <10? – knocte