2013-03-21 11 views
7

Mam kilka skryptów Pythona, który zacznę wspólnie ze skryptu powłoki, co następuje:Jak zabić wszystkie procesy, które zostały otwarte przez skrypt powłoki po Ctrl + C?

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

Od Zajmuję często chcą, aby zatrzymać tych procesów. Zwykle robię to naciskając ctrl + C, ale niefortunnie otwarte są kilka gniazd Pythona (zeromq). Oznacza to, że muszę ręcznie je znaleźć (używam lsof -i) i zabić je za pomocą PID.

Poszukuję łatwiejszego sposobu automatycznego zabicia procesów Pythona z powłoki po naciśnięciu Ctrl + C. Na another thread here on Stackoverflow znalazłem kod, który rzekomo powinien zrobić to, czego potrzebuję. Po prostu nie rozumiem nic o kodzie i jak mogę go dostosować do moich potrzeb.

Czy ktoś byłby tak uprzejmy, aby mi pomóc?

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!" 

Odpowiedz

11

Niech skryptu bash catch SIGINT, i zabić wszystko, co w obecnej grupy procesów:

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 miła, starałem się stworzyć ten sam scenariusz z kontrolą pracy i jestem bardzo rozczarowany bash nie oferuje sposobu na określenie wielu zadań. 'kill%? python' miałoby sens. – kojiro

+0

To jest niesamowite! Wielkie dzięki! Tylko pytanie; Zminimalizowałem twój kod do kodu poniżej, który wydaje się działać tak samo. Po co na resztę? #!/Bin/bash intexit() {kill -HUP - $$; wyjście; } trap intexit INT python prog1.py i python prog2.py i python prog3.py – kramer65

+0

'hupexit' wypisuje ładną wiadomość,' wait' jest po prostu tak, że kod wygląda bardziej jednolicie (zaczynamy wszystko w tło i czekać). – nneonneo

Powiązane problemy