scripts script resueltos programacion pasar parametros manejo espaƱol ejercicios ejemplos comandos cadenas bash scripting sh long-running-processes sigterm

bash - resueltos - script de shell para generar procesos, terminar hijos en SIGTERM



scripts linux ejercicios resueltos (4)

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

Básicamente, quiero un "proceso maestro".

Esto es lo que obtuve 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


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

¿Cómo se envía la señal SIGTERM al "proceso maestro"? Tal vez deberías 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 debería agregar el sistema operativo, la versión del shell, kernel, ... para esa pregunta


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.

El script final se ve así:

#!/bin/sh sleep 600 & PID1="$!" sleep 600 & PID2="$!" trap "kill $PID1 $PID2" exit INT TERM wait


Sospecho que tu / bin / sh no es un Bash (aunque etiquetaste la pregunta como ''Bash'').

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


Esto funciona para mí:

trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT

  • kill -- -$$ envía un SIGTERM a todo el grupo de procesos, matando también a los descendientes.

  • La especificación de la señal EXIT es útil cuando se utiliza el set -e (más detalles aquí ).