Pregunta

Quiero atrapar un envío de señales de Script-A.sh a Script-B.sh por lo que en Script-A.sh i utilizar el comando:

  

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

Y en Script-B.sh le cojo la función de la señal y de extinción

  

trampa 'Clean' 2

No funciona, en lugar del Script-B.sh se mató de inmediato sin realizar el Clean !!

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

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

¿Fue útil?

Solución

Yo era capaz de reproducir el comportamiento que se informe. Mi hipótesis es que, dado que se ejecuta el script de una cáscara no interactivo (como un hijo de un guión) que SIGINT, que es una señal de teclado, se ignora.

De info bash:

  

procesos de fondo son aquellos cuyo grupo difiere ID de proceso de la          de terminales; 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:

  

No-incorporado comandos ejecutados por bash tienen manejadores de señales establecidos a los valores heredados por la cáscara de su matriz. Cuando el control de trabajo no está en vigor, los comandos asíncronos ignoran SIGINT y SIGQUIT además de estos controladores heredados.

y

  

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

y

  

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

Otros consejos

En la escritura A: Trampa función se verá como después de que se llame a la función trap_mesg () en scriptA.sh. KILL de señal (2 / interrumpir, 5 / terminar-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 ... y le dará o el uso de comandos ps)

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, hacer lo mismo / similar, pero sólo para el trabajo trampa scriptB (como llamar limpia).

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 ...."

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top