Come inviare un segnale SIGINT da script per lo script?
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?
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 ...."