2009-06-10 25 views
6

Quiero escribir un script de shell que genere varios procesos de larga ejecución en segundo plano, y luego se cuelga. Al recibir SIGTERM, quiero que todos los subprocesos terminen también.script de shell para generar procesos, finalizar hijos en SIGTERM

Básicamente, quiero un "proceso maestro".

Esto es lo que tengo hasta ahora:

#!/bin/sh 

sleep 600 & 
PID1="$!" 

sleep 600 & 
PID2="$!" 

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

wait 

El script anterior falla con trap: 10: SIGTERM: bad trap.

Editar: Estoy usando Ubuntu 9.04

Respuesta

5

La respuesta de Joe me puso en el camino correcto. También descubrí que debería atrapar más señales para cubrir mis bases.

guión final es el siguiente:

#!/bin/sh 

sleep 600 & 
PID1="$!" 

sleep 600 & 
PID2="$!" 

trap "kill $PID1 $PID2" exit INT TERM 

wait 
+1

. Si crees que debes usar números de señal, solo debes usar los normalizados. Pero sigo para utilizar los nombres de señal de su sistema. – TheBonsai

+0

Tienes razón. Espero que esta sea la última versión ... – itsadok

+0

Bueno, es tu código, puedes tener tantas versiones como quieras ;-) – TheBonsai

1

Este script es correcto y funciona para mí como se esperaba.

¿Cómo se envía la señal SIGTERM al "proceso maestro"? Quizás deba ejecutar kill -l para verificar qué señales son compatibles. Como el mensaje de error sugiere que envíe la señal "10" que su sistema no parece reconocer.

Y la próxima vez que usted debe agregar el sistema operativo, la versión cáscaras, huesos, ... para una pregunta tan

+0

Gracias por la respuesta. Estoy usando Ubuntu 9.04, y al leer tu respuesta me di cuenta de que esto probablemente era una cosa de bash vs. De hecho, funciona como se anuncia si cambio la primera línea a #!/Bin/bash – itsadok

4

Sospecho que su/bin/sh no es un golpe (aunque la cuestión etiquetado como 'Bash')

Según el mensaje, supongo que es DASH. Verifique su manual o simplemente arregle su shebang si necesita escribir el código Bash.

10

Esto funciona para mí:

trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT 
  • kill -- -$$ envía un SIGTERM a todo el grupo de procesos, matando así también descendientes.

  • La señal de especificación EXIT es útil cuando se usa set -e (más detalles here).

+0

¿Qué significa pid 0? ¿Y te refieres al '...' literalmente, o como un marcador de posición? – itsadok

+0

De alguna manera esto solo funcionó para mí cuando usé 'kill - 0' en lugar de' kill - - $$ '. Este último dijo '11641: no se encontró proceso' por alguna razón. – WorldSEnder