2013-02-25 8 views
5

Also habe ich vor kurzem erfahren, dass kill is not a synchronous Befehl, so dass ich mit dieser while-Schleife in bash, die genial:bash: Zähler in einer while-Schleife (töten und töten -9)

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

jedoch Es gibt Fälle (sehr selten, aber sie kommen immer noch vor), in denen der Prozess hängen bleibt, und es wirkt nicht auf das Tötungssignal. In diesen Fällen besteht die einzige Möglichkeit zum Beenden der App darin, "kill -9" zu verwenden.

Also frage ich mich, wie würde man die while-Schleife oben in bash ändern, um das Argument -9 nur zu verwenden, wenn die Schleife die 10. Iteration erreicht hat?

+0

Was ist Ihre Frage? Sie möchten wissen, wie man zählt? –

+0

Ich möchte wissen, wie man einen Zähler innerhalb einer while-Schleife in bash verwendet, ich bin keine bash lesen – knocte

+2

Wenn Sie wissen wollen, wie man einen Zähler in bash erstellen, stellen Sie nicht die Frage über 'kill -9'. Das wird die Gewässer ernsthaft beschmutzen, da 'kill -9' normalerweise eine schlechte Idee ist, und * definitiv * eine schlechte Idee in einem Skript zu machen. – kojiro

Antwort

1

Sicher, verwenden Sie einen Zähler, aber das ist ein wenig Schinken-Faust.

Was Sie wahrscheinlich wirklich tun möchten, ist 0 als Ihr Signal zu verwenden, was nichts mit dem Prozess zu tun hat, aber lassen Sie überprüfen, ob der Prozess noch am Leben ist. (kill -0 $pid wird einen Nicht-Null-Exit-Status zurückgeben, wenn der Prozess nicht existiert.) Und dann, wissen Sie, tun Sie nicht nur kill -9 es. Prozesse bleiben nicht ohne Grund stecken, sie bleiben stecken, weil sie eine Ressource nicht loslassen können, etwa wenn das Netzwerk oder das Dateisystem blockiert wird. Beheben Sie den Block, dann kann der Prozess nach sich selbst aufräumen.

+0

Entschuldigung, können Sie ein wenig mehr auf das 0-Signal? Ich verstehe immer noch nicht den Unterschied zwischen Kill und Kill-0 – knocte

+0

@knocte 'Kill-0' tut nichts zum Prozess, wenn es einen findet. Es lässt dich einfach wissen, dass es da ist. Denken Sie daran, wie Sie den Prozess anpingen, um zu sehen, ob er noch lebt. – kojiro

+0

aber plain kill (ohne -0) gibt auch einen Nicht-Null-Status zurück, wenn es nicht existiert, so verbessert dies nichts wirklich – knocte

1

Es genügt, das Signal einmal zu senden.

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

Für Ihre Gegenfrage:

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

Ich sagte 10. Iteration, nicht 10 Sekunden – knocte

+0

aktualisiert ......... –

+0

in Ordnung, wenn Sie beide Code-Blöcke in einem kombinieren Ich werde upvote :) – knocte

2

Wie andere Benutzern sagen .... Sie die Ursache des Blocks vor dem Gebrauch zu beheben haben diese brutale Methode ... wie auch immer ... versuchen, diese

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

war 'PID_OF_THE_PROCESS' soll ein sein Variable? – kojiro

+0

das ist fast das, was ich erreichen möchte! es fehlt nur der Aufruf "Kill" in den vorherigen Iterationen vor dem 10. – knocte

+0

@knocte Wenn Sie SIGTERM einmal senden, wird es beendet, wenn es möglich ist. Es 9 Mal mehr zu senden ist sinnlos. – kojiro

0

Es gibt mehrere Möglichkeiten, dies zu erreichen, muss man aber fragen Sie Ihren bestehenden Schleife zu ändern, so:

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

Kannst du einfach ein Elif hinzufügen, um den Prozess in der N-Iteration zu beenden, wenn count <10? – knocte