Frage

Ich möchte ein Signal senden zu stoppen von Script-A.sh zu Script-B.sh so in Script-A.sh verwende ich den Befehl:

  

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

Und in Script-B.sh fangen i das Signal und Anruffunktion reinigen

  

trap 'Clean' 2

Es funktioniert nicht, stattdessen die Script-B.sh werden sofort getötet, ohne dass die Durchführung reinigen !!

Was ich bemerken ist auch, dass, wenn ich will von Terminal zu jedem Skript SIGINT senden, dass Fallen, es werden ein ctrl-c richtig erwischt werden, aber nicht, wenn ich das Signal über den Befehl angeben kill -2 $pid_of_script

Jede Idee, über den Unterschied zwischen den beiden Verfahren der SIGINT (ctrl-c VS kill -2 $pid_of_script) zu senden, und wie ich ein SIGINT von einem Skript zum anderen senden kann?

War es hilfreich?

Lösung

Ich war in der Lage, das Verhalten Sie berichten zu reproduzieren. Meine Hypothese ist, dass, da das Skript ausgeführt wird von ein nicht-interaktiv Shell (als Kind eines Skripts), dass SIGINT, die ein Tastatur-Signal ist, wird ignoriert.

Von info bash:

  

Hintergrundprozesse sind solche, deren Prozessgruppen-ID unterscheidet sich von der          Terminals; solche Verfahren sind immun gegen eine Tastatur erzeugten Signale.

Ich habe festgestellt, dass, wenn Sie trap und kill mit einem anderen Signal, wie SIGUSR1 funktioniert es.

Weitere Informationen von man bash:

  

Non-builtin durch bash Befehle ausführen Signalroutinen haben auf die Werte gesetzt, indem die Schale von ihrem Elternteil vererbt. Wenn Auftragssteuerung nicht wirksam ist, ignorieren asynchrone Befehle SIGINT und SIGQUIT zusätzlich zu diesen vererbten Handler.

und

  

Wenn bash für einen Befehl, um ein vollständiges wartet und empfängt ein Signal, für das eine Falle gestellt wurde, wird der Fall nicht bis dem Befehl ausgeführt ausgeführt werden.   

und

  

Jede Falle auf SIGCHLD wird für jedes Kind ausgeführt, dass beendet wird.

Andere Tipps

In Skript A: Trap-Funktion sieht wie folgt die trap_mesg () Funktion in scriptA.sh rufen. KILL-Signal (2 / INTERRUPT, 5 / terminate-Standard). Alle, müssen Sie tun, ist die PID eines runing scriptB.sh Prozess / Sitzung zu erhalten, sobald scriptB.sh von scriptA.sh genannt wird (nohup ... & werden Sie oder verwenden Sie ps Befehl geben)

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


Nun innerhalb scriptB.sh, tun das gleiche / ähnliche, aber nur für scriptB Trap Job (wie der Aufruf sauber).

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

Auf diese Weise müssen Sie nicht zu Quelle haben / Call scriptB.sh innerhalb scriptA.sh als "scriptB.sh ...."

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top