Domanda

Voglio intercettare un segnale di inviare da Script-A.sh a Script-B.sh così in Script-A.sh io uso il comando:

  

(Invia SIGINT a Script-B.sh)
  uccidere -2 $ PID_Script-B.sh

E in Script-B.sh prendo la funzione del segnale di chiamata e Clean

  

trappola 'Clean' 2

Non funziona invece lo Script-B.sh viene ucciso subito senza eseguire il Clean !!

Quello che ho notato anche che se voglio inviare SIGINT dal terminale a qualsiasi script che intrappola esso, un ctrl-c sarà catturato correttamente, ma non se a specificare il segnale tramite il comando kill -2 $pid_of_script

Qualche idea circa la differenza tra i due metodo per inviare il SIGINT (ctrl-c VS kill -2 $pid_of_script), e come posso inviare un SIGINT da uno script ad un altro?

È stato utile?

Soluzione

Sono stato in grado di riprodurre il comportamento di segnalare. La mia ipotesi è che dal momento che lo script è in esecuzione da di una shell non interattiva (in quanto figlio di uno script) che SIGINT, che è un segnale di tastiera, viene ignorato.

Da info bash:

  

processi di sfondo sono quelli il cui processo di gruppo ID differisce dalla          del terminale; tali processi sono immuni ai segnali generati da tastiera.

Ho scoperto che se si trap e kill utilizzando un altro segnale di come SIGUSR1 funziona.

Informazioni aggiuntive da man bash:

  

comandi non built gestite da bash hanno gestori di segnali impostati sui valori ereditati dalla shell dal suo genitore. Quando il controllo lavoro non è attivo, i comandi asincroni ignorano SIGINT e SIGQUIT in aggiunta a questi gestori ereditarie.

e

  

Se bash è in attesa di un comando per completare e riceve un segnale per il quale è stata impostata una trappola, la trappola non verrà eseguita fino al completamento del comando.   

e

  

Ogni trappola su SIGCHLD viene eseguito per ogni bambino che esce.

Altri suggerimenti

Nella sceneggiatura A: funzione di trappola sarà simile dopo che chiamerà la funzione trap_mesg () in scriptA.sh. KILL segnale (2 / interrupt, 5 / TERMINARE-default). Tutto, quello che dovete fare è quello di ottenere il PID di un runing scriptB.sh processo / sessione una volta scriptB.sh viene chiamato da scriptA.sh (nohup ... & vi darà o comando ps utilizzo)

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
##################################


Ora, all'interno di scriptB.sh, fare lo stesso / simile, ma solo per scriptB lavoro trappola (come chiamare pulito).

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
##################################

In questo modo, non dovete fonte / chiamare scriptB.sh all'interno scriptA.sh come "scriptB.sh ...."

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top