2009-06-10 15 views
6

Chcę napisać skrypt powłoki, który odradza kilka długotrwałych procesów w tle, a następnie rozłącza się. Po otrzymaniu SIGTERM, chcę, aby wszystkie podprocesy również się zakończyły.Skrypt powłoki do odradzania procesów, kończenia dzieci na SIGTERM

Zasadniczo chcę "proces główny".

Oto co mam do tej pory:

#!/bin/sh 

sleep 600 & 
PID1="$!" 

sleep 600 & 
PID2="$!" 

# supposedly this should kill the child processes on SIGTERM. 
trap "kill $PID1 $PID2" SIGTERM 

wait 

Powyższy skrypt nie działa z trap: 10: SIGTERM: bad trap.

Edycja: używam Ubuntu 9.04

Odpowiedz

5

Odpowiedź Joe postawiła mnie na dobrej drodze. Dowiedziałem się też, że powinienem złapać więcej sygnałów, żeby pokryć moje bazy.

końcowy skrypt wygląda tak:

#!/bin/sh 

sleep 600 & 
PID1="$!" 

sleep 600 & 
PID2="$!" 

trap "kill $PID1 $PID2" exit INT TERM 

wait 
+1

Jeśli uważasz, że musisz używać numerów sygnałów, powinieneś używać tylko tych standardowych. Ale polecam zamiast tego używać nazw sygnałów z twojego systemu. – TheBonsai

+0

Masz rację. Mam nadzieję, że to jest ostatnia wersja ... – itsadok

+0

Cóż, to twój kod, możesz mieć tyle wersji, ile chciał ;-) – TheBonsai

1

Ten skrypt wygląda poprawnie i działa na mnie jak oczekiwano.

Jak wysłać sygnał SIGTERM do "procesu głównego"? Może powinieneś wykonać kill -l, aby sprawdzić, które sygnały są obsługiwane. Ponieważ komunikat o błędzie sugeruje wysłanie sygnału "10", który twój system nie rozpoznaje.

I następnym razem należy dodać system operacyjny, wersja Shell, jądro ... W takim pytaniem

+0

Dzięki za odpowiedź. Używam Ubuntu 9.04 i czytając twoją odpowiedź, zdałem sobie sprawę, że to prawdopodobnie bash vs dash. Rzeczywiście działa tak jak w reklamie, jeśli zmienię pierwszą linię na #!/Bin/bash – itsadok

4

Podejrzewam plik/bin/sh nie jest Bash (chociaż pytanie oznaczone jako „Bash”).

Z wiadomości Myślę, że to DASH. Sprawdź swoją instrukcję lub po prostu napraw swój shebang, jeśli potrzebujesz napisać kod Bash.

10

Działa to dla mnie:

trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT 
  • kill -- -$$ wysyła SIGTERM do całej grupy procesów, a tym samym zabijając również potomków.

  • Podanie sygnału EXIT jest przydatne w przypadku korzystania z set -e (więcej szczegółów: here).

+0

Co oznacza pid 0? I masz na myśli "..." dosłownie lub jako symbol zastępczy? – itsadok

+0

Jakoś to zadziałało, gdy użyłem 'kill - 0' zamiast' kill - - $$ '. Ten ostatni powiedział "11641: nie znaleziono procesu" z jakiegoś powodu. – WorldSEnder

Powiązane problemy