2009-06-10 5 views
6

Voglio scrivere uno script di shell che genera diversi processi a esecuzione prolungata in background, quindi si blocca. Alla ricezione di SIGTERM, voglio che anche tutti i sottoprocessi terminino.script di shell per generare processi, terminare i bambini su SIGTERM

Fondamentalmente, voglio un "processo master".

Ecco quello che ho ottenuto finora:

#!/bin/sh 

sleep 600 & 
PID1="$!" 

sleep 600 & 
PID2="$!" 

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

wait 

Lo script di cui sopra non riesce con trap: 10: SIGTERM: bad trap.

Edit: sto usando Ubuntu 9.04

risposta

5

La risposta di Joe mi ha messo sulla strada giusta. Ho anche scoperto che dovevo intrappolare più segnali per coprire le mie basi.

finale del copione simile a questa:

#!/bin/sh 

sleep 600 & 
PID1="$!" 

sleep 600 & 
PID2="$!" 

trap "kill $PID1 $PID2" exit INT TERM 

wait 
+1

Se pensi di dover usare i numeri di segnale, dovresti usare solo quelli standardizzati. Ma preferisco usare i nomi dei segnali del tuo sistema. – TheBonsai

+0

Hai ragione. Spero che questa sia l'ultima versione ... – itsadok

+0

Bene, è il tuo codice, puoi avere tutte le versioni che desideri ;-) – TheBonsai

1

Questo script è corretto e funziona per me come previsto.

Come si invia il segnale SIGTERM al "processo principale"? Forse dovresti eseguire kill -l per verificare quali segnali sono supportati. Come il messaggio di errore suggerisce di inviare il segnale "10" che il tuo sistema sembra non riconoscere.

E la prossima volta che si dovrebbe aggiungere il sistema operativo, la versione della shell, kernel, ... per una questione del genere

+0

Grazie per la risposta. Sto usando Ubuntu 9.04, e leggendo la tua risposta ho capito che si trattava probabilmente di una cosa bash contro dash. Funziona davvero come pubblicizzato se cambio la prima riga in #!/Bin/bash – itsadok

4

Ho il sospetto che il vostro/bin/sh non è un Bash (anche se si contrassegnati la questione 'Bash').

Dal messaggio credo sia un DASH. Controlla il suo manuale o aggiusta il tuo shebang se hai bisogno di scrivere il codice di Bash.

10

questo funziona per me:

trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT 
  • kill -- -$$ invia un SIGTERM a tutto il gruppo di processi, uccidendo così anche discendenti.

  • La specifica del segnale EXIT è utile quando si utilizza set -e (ulteriori dettagli here).

+0

Che cosa significa pid 0? E intendi il '...' letteralmente, o come segnaposto? – itsadok

+0

In qualche modo questo ha funzionato solo con me quando ho usato 'kill-0' al posto di' kill - - $$ '. Quest'ultimo ha detto "11641: nessun processo trovato" per qualche motivo. – WorldSEnder