Domanda

Voglio scrivere uno script di shell che genera diversi processi di lunga esecuzione in background, poi si blocca intorno. Alla ricezione di SIGTERM, voglio che tutti i sottoprocessi per terminare pure.

In sostanza, voglio un "processo di 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

È stato utile?

Soluzione 2

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

finale del copione è simile al seguente:

#!/bin/sh

sleep 600 &
PID1="$!"

sleep 600 &
PID2="$!"

trap "kill $PID1 $PID2" exit INT TERM

wait

Altri suggerimenti

Questo funziona per me:

trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
  • kill -- -$$ manda un SIGTERM all'intero gruppo processo , uccidendo così anche discendenti.

  • Specificando EXIT segnale è utile quando si utilizzano set -e (maggiori dettagli qui ).

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

Dal messaggio Credo che sia un trattino. Controllare il suo manuale o semplicemente risolvere il faccenda se è necessario scrivere codice Bash.

Questo script è corretto e funziona per me come previsto.

Come si fa a mandare il segnale SIGTERM al "processo di master"? Forse si dovrebbe eseguire kill -l per verificare che i segnali sono supportati. Come suggerisce il messaggio di errore si invia il segnale "10", che il sistema non sembra riconoscere.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top