Tengo un CD en vivo que arranca en Linux y ejecuta un pequeño script Bash. El script busca y ejecuta un segundo programa (que generalmente es un binario compilado de C ++).
Se supone que puedes abortar el segundo programa presionando Ctrl+ C. Lo que debería suceder es que el segundo programa se detiene y el script Bash continúa ejecutando la limpieza. Lo que realmente sucede es que tanto la aplicación principal como el script Bash finalizan. Que es un problema
Así que usé el trap
incorporado para decirle a Bash que ignorara SIGINT. Y ahora Ctrl+ Cfinaliza la aplicación C ++, pero Bash continúa su ejecución. Excelente.
Ah, sí ... A veces la "segunda aplicación" es otra secuencia de comandos Bash. Y en ese caso, Ctrl+ Cahora no hace nada en absoluto .
Claramente, mi comprensión de cómo funciona esto está mal ... ¿Cómo controlo qué proceso obtiene SIGINT cuando el usuario presiona Ctrl+ C? Quiero dirigir esta señal a un solo proceso específico .
set -m
. Es un poco más limpio y simple que usarlosetsid
cada vez que ejecutas a un niño.Como mencioné en el comentario a f01, deberías enviar SIGTERM al proceso secundario. Aquí hay un par de scripts que muestran cómo atrapar ^ C y enviar una señal a un proceso secundario.
Primero, el padre.
prueba trampa
Y ahora, el niño.
Sleeploop
Si traptest envía SIGTERM, las cosas se comportan bien, pero si traptest envía SIGINT, sleeploop nunca lo ve.
Si sleeploop atrapa SIGTERM, y el modo de suspensión está en primer plano, entonces no puede responder a la señal hasta que se despierte de la suspensión actual. Pero si el modo de suspensión es de fondo, responderá de inmediato.
fuente
En tu guión bash de inicio.
realizar un seguimiento del PID del segundo programa
atrapar la señal
cuando haya detectado un SIGINT, envíe un SIGINT al segundo PID del programa
fuente