Question

Je veux piéger un signal envoyer de Script-A.sh à Script-B.sh de manière à Script-A.sh i utilise la commande:

  

(Envoyer SIGINT à Script-B.sh)
  tuer -2 PID_Script-B.sh $

Et Script-B.sh i attrape la fonction de signal et appel propre

  

trap 'Clean' 2

Il ne fonctionne pas, au lieu du Script-B.sh est tué tout de suite sans effectuer le Clean !!

Qu'est-ce que je remarque aussi que si je veux envoyer SIGINT du terminal à un script qu'il emprisonne, un ctrl-c sera pris correctement, mais pas si je spécifie le signal via la commande kill -2 $pid_of_script

Toute idée sur la différence entre les deux méthode pour envoyer SIGINT (VS ctrl-c kill -2 $pid_of_script), et comment je peux envoyer un SIGINT d'un script à un autre?

Était-ce utile?

La solution

Je suis en mesure de reproduire le comportement que vous déclarez. Mon hypothèse est que, puisque le script est en cours d'exécution de un shell non interactif (comme un enfant d'un script) qui SIGINT, qui est un signal de clavier, est ignoré.

De info bash:

  

processus d'arrière-plan sont ceux dont le groupe ID processus diffère de la          du terminal; de tels procédés sont insensibles aux signaux générés au clavier.

J'ai trouvé que si vous trap et kill en utilisant un autre signal tel que SIGUSR1 cela fonctionne.

Informations complémentaires de man bash:

  

commandes non prédéfinies gérées par bash ont les gestionnaires de signaux fixés aux valeurs héritées par la coque de son parent. Lorsque le contrôle du travail n'a pas de sens, des commandes asynchrones et ne tiennent pas compte SIGINT SIGQUIT en plus de ces gestionnaires héréditaires.

et

  

Si bash est en attente d'une commande à remplir et reçoit un signal pour lequel un piège a été fixé, le piège ne sera pas exécutée jusqu'à ce que la commande se termine.   

et

  

Tout piège sur SIGCHLD est exécuté pour chaque enfant qui sort.

Autres conseils

Dans le script A: fonction piège ressemblera suivant qui fera appel à la fonction trap_mesg () dans scriptA.sh. KILL signal (2 / interrompre, 5 / terminate-défaut). Tous, vous avez à faire est d'obtenir le PID d'un processus scriptB.sh runing / session, une fois scriptB.sh est appelé à partir scriptA.sh (nohup ... et vous donnera ou utilisez la commande 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
##################################


Maintenant, dans scriptB.sh, faire la même chose / similaire, mais juste pour l'emploi piège scriptB (comme appeler propre).

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 cette façon, vous n'avez pas à la source / appel scriptB.sh au sein scriptA.sh comme "scriptB.sh ...."

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top