2013-03-21 3 views
7

Ich habe ein paar Python-Skripte bekam, die ich gemeinsam von einem Shell-Skript wie folgt starten:Wie um alle Prozesse zu beenden, die von einem Shell-Skript nach Strg + C geöffnet wurden?

#!/bin/bash 
python prog1.py & 
python prog2.py & 
python prog3.py 

Da ich ich bin oft zu entwickeln, diese Prozesse beenden möchten. Normalerweise tue ich dies, indem ich Strg + C drücke, aber unglücklicherweise bleiben ein paar Python-Programme (zeromq) geöffnet. Dies bedeutet, dass ich sie dann manuell finden muss (ich verwende lsof -i) und kille sie mit der PID ab.

Also suche ich nach einer einfacheren Möglichkeit, diese Python-Prozesse automatisch aus der Shell zu löschen, wenn ich Strg + C drücke. Auf another thread here on Stackoverflow habe ich einen Code gefunden, der angeblich tun sollte, was ich brauche. Ich verstehe nichts über den Code und wie ich ihn an meine Bedürfnisse anpassen könnte.

Würde jemand so freundlich sein, mir hier zu helfen?

cat >work.py <<'EOF' 
import sys, time, signal 
signal.signal(signal.SIGINT, signal.SIG_DFL) 
for i in range(10): 
    time.sleep(1) 
    print "Tick from", sys.argv[1] 
EOF 
chmod +x work.py 

function process { 
    python ./work.py $1 
} 

process one & 
wait $! 
echo "All done!" 

Antwort

11

den SIGINT Bash-Skript fangen lassen, und es hat alles in der aktuellen Prozessgruppe töten:

intexit() { 
    # Kill all subprocesses (all processes in the current process group) 
    kill -HUP -$$ 
} 

hupexit() { 
    # HUP'd (probably by intexit) 
    echo 
    echo "Interrupted" 
    exit 
} 

trap hupexit HUP 
trap intexit INT 

python prog1.py & 
python prog2.py & 
python prog3.py & 

wait 
+0

+1 nett, ich hatte versucht, das gleiche Skript mit Auftragssteuerung zu erstellen und ist ziemlich enttäuscht bash bietet keine Möglichkeit, mehrere Jobs anzugeben. 'kill%? python' hätte Sinn ergeben. – kojiro

+0

Das ist großartig! Danke vielmals! Nur eine Frage; Ich habe Ihren Code auf den folgenden Code minimiert, der scheinbar gleich funktioniert. Wofür ist der Rest? #!/Bin/bash intexit() {kill -HUP - $$; Ausfahrt; } Falle intexit INT Python prog1.py & Python prog2.py & Python prog3.py – kramer65

+0

'hupexit' eine nette Nachricht ausdruckt,' wait' nur so ist, dass der Code einheitlichere sieht (wir alles in der Start Hintergrund und warten). – nneonneo

Verwandte Themen