2010-03-26 27 views
11

Quiero atrapar una señal de envío de Script-A.sh a Script-B.sh por lo que en Script-A.sh i utilizar el comando¿Cómo enviar una señal SIGINT desde el script al script? BASH

(SIGINT Enviar a Script-B.sh)
matanza -2 $ PID_Script-B.sh

y en Script-B.sh i coger la función de la señal y de extinción

trampa 'Clean' 2

No funciona, en su lugar, el Script-B.sh se elimina de inmediato sin realizar el Clean !!

lo que noto también que si quiero enviar SIGINT de terminal a cualquier secuencia de comandos que atrapa a él, un ctrl-c serán apresados ​​correctamente, pero no si se especifica la señal a través del comando kill -2 $pid_of_script

Cualquier idea acerca la diferencia entre los dos métodos para enviar el SIGINT (ctrl-c VS kill -2 $pid_of_script), y cómo puedo enviar un SIGINT de un script a otro?

Saludos,

depurador

Respuesta

12

que era capaz de reproducir el comportamiento que se informe. Mi hipótesis es que, dado que el script se está ejecutando desde un shell no interactivo (como elemento secundario de un script) que se ignora SIGINT, que es una señal de teclado.

De info bash:

procesos en segundo plano son aquellos cuyo ID de grupo del proceso difiere de la terminal; tales procesos son inmunes a las señales generadas por el teclado.

He encontrado que si trap y kill mediante otra señal como SIGUSR1 funciona.

información adicional de man bash:

comandos

no incorporadas a cargo de golpe tiene manejadores de señales establecidos a los valores heredados por la cáscara de su matriz. Cuando el control del trabajo no está en vigencia, los comandos asincrónicos ignoran SIGINT y SIGQUIT además de estos manejadores heredados.

y

Si bash se espera de un comando para completar y recibe una señal para la que se ha establecido una trampa, la trampa no se ejecutará hasta que se complete el mandato.

y

Cualquier trampa en SIGCHLD se ejecuta para cada niño que sale.

+0

Ese primer bit de bash (1) parece una explicación Además, * zsh * parece funcionar bien. –

+0

Perdón por esta respuesta tardía. Tienes razón, no todas las señales pueden atraparse para los niños, sino algunas. SIGUSR1 funcionó tanto para mí como para SIGTERM, pero no en todas las versiones de bash, porque obtuve una falla de segmentación de un script en bash 3.00.16 cuando intentaba enviar la señal de padre a hijo. Otras veces, usando la misma versión, simplemente ignorará la señal sin atraparla (en el nivel de niños). Pero las versiones más nuevas funcionan bien y propagan correctamente todas las señales. Muchas gracias por su ayuda – Debugger

+0

ok. Ejecute scriptA shell script y llame a scriptB (source it) como ". scriptB.sh param1 param2 ... paramN", de esa forma, se mantendrá limpio para Sig 2/INT –

0

En secuencia de comandos A: la función Trap se verá como sigue, que llamará a la función trap_mesg() en scriptA.sh. KILL Signal (2/INTerrupt, 5/TERMinate-default). Todo, lo que tiene que hacer es obtener el PID de un proceso de scriptB.sh/sesión runing vez scriptB.sh se llama desde scriptA.sh (nohup ... & le o el uso de comandos ps dan)

trap_mesg() 
{ 
#...do something here for script B.. 
# i.e. 
kill -2 PID_of_ScriptB.sh_running_process_session 
sleep 10; #just in case, not reqd though. 
#show using ps -eAf|grep "scriptB" ... if null means, scriptB is gone. user is happy now. 
#...before actually exiting out... 
#show script A is exiting out as ScriptB is dead already, time for scriptA now. 
#...do something here.. 
} 

##################################### 
## Trap signals : INT, TERM. catch ## 
##################################### 
#Set NULL/Blank value to trap_call. This variable will help in running trap_mesg only once during the life of this script. 
trap_call=""; 

trap 'if [ -z ${trap_call} ]; then trap_call="1"; trap_mesg ; fi' 2 15 
################################## 




Ahora, dentro de scriptB.sh, haga lo mismo/similar pero solo para scriptB trap job (como llamar a clean).

clean() 
{ 
echo "karoge seva to milega meva"; 
rm -fr /some/folder_file 
} 

trap_mesg() 
{ 
#...do something here JUST for script B trap message work.. 
# i.e. 
clean; 
#...do something here.. 
} 

##################################### 
## Trap signals : INT, TERM. catch ## 
##################################### 
#Set NULL/Blank value to trap_call. This variable will help in running trap_mesg only once during the life of this script. 
trap_call=""; 

trap 'if [ -z ${trap_call} ]; then trap_call="1"; trap_mesg ; fi' 2 15 
################################## 

De esta manera, usted no tiene que fuente/call scriptB.sh dentro scriptA.sh como "scriptB.sh ...."

Cuestiones relacionadas