2009-06-04 16 views
7

Ich habe ein sehr einfaches Problem: Wenn ich ein Shell-Skript ausführen, starte ich ein Programm, das in einer Endlosschleife läuft. Nach einer Weile möchte ich dann dieses Programm anhalten, bevor ich es wieder mit anderen Parametern kann. Die Frage ist nun, wie finde ich die PID von das Programm, wenn ich es ausführen? Grundsätzlich möchte ich so etwas tun:Killing Prozess in Shell Script

echo "Executing app1 with param1" 
./app1 param1 & 
echo "Executing app1" 
..do some other stuff 
#kill somehow app1 
echo "Execution of app1 finished!" 

Danke!

Antwort

0
killall app1 
2

Sie die pid von app1 erhalten mit

ps ux | awk '/app1/ && !/awk/ {print $2}' 

und dann sollten Sie in der Lage sein, es zu töten .... (aber wenn Sie mehrere Instanzen von app1 haben, können Sie töten‘ em alle)

5

In bash $! expandiert auf die PID des letzten Prozesses im Hintergrund gestartet. So können Sie tun:

./app1 param1 & 
APP1PID=$! 
# ... 
kill $APP1PID 
+0

Danke für alle Antworten, aber diese hier ist mein Favorit! –

15

In den meisten Muscheln (einschließlich Bourne und C), die PID der letzten subprocess Sie im Hintergrund gestartet wird in dem speziellen Variable $ gespeichert sein !.

#!/bin/bash 
./app1 & 
PID=$! 
# ... 
kill $PID 

Es gibt some information here im Abschnitt Spezielle Variablen.

3

, wenn Sie die PID eines Prozesses, um herauszufinden möchten, können Sie ps verwenden:

[[email protected] ~]$ ps h -o pid -C app1 

der Parameter -o pid sagt, dass Sie nur die PID des Prozesses wollen, -C app1 gibt den Namen der Prozess, den Sie abfragen möchten, und der Parameter h wird verwendet, um den Header der Ergebnistabelle zu unterdrücken (ohne sie würden Sie einen "PID" -Kopf über der PID selbst sehen). Nicht, wenn es mehr als einen Prozess mit demselben Namen gibt, werden alle PIDs angezeigt.

, wenn Sie diesen Prozess töten wollen, können Sie verwenden:

[[email protected] ~]$ kill `ps h -o pid -C app1` 

obwohl killall ist sauberer, wenn Sie nur das tun wollen (und wenn Sie nichts dagegen nicht alle „app1“ Prozesse zu töten). Sie können auch head oder tail verwenden, wenn Sie nur die erste bzw. letzte PID wünschen.

und ein Tipp für die fish Benutzer: %process wird durch die PID process ersetzt. so, in Fisch, könnten Sie verwenden:

[email protected] ~> kill %app1 
0

Ich hatte ein Problem, wo der Prozess, den ich zu töten wurde ein Python-Skript, und ich hatte ein anderes Skript, das auch Python ausgeführt wurde. Ich wollte Python wegen des anderen Skripts nicht töten.

I awk verwendet um damit umzugehen (lassen myscript Ihre Python-Skript sein): töten ps -ef|grep 'python myscript.py'|awk '!/awk/ && !/grep/ {print $2}'

nicht so effizient sein könnte, aber ich würde eher Effizienz für Vielseitigkeit in einer Aufgabe wie diese handeln.