Ich muss ein Programm xyz ausführen. Die Ausführung ist in wenigen Sekunden abgeschlossen. Es hat eine Signalverarbeitung, die ich testen muss. Wie führe ich das Programm von der Shell oder einem Bash-Skript aus aus und sende ihm während der Ausführung ein Signal wie kill -14
.
Derzeit ist der Befehl, den ich versuche,
/usr/local/xyz input > some_file 2>&1 & PIDOS=$! && kill -14 $PIDOS
Scheint die Signalverarbeitung nicht auszulösen.
Antwort1
Dieser Befehl sieht ok aus. Als ich ihn jedoch ausprobierte, stellte sich heraus, dass der Befehl zu schnell war. Es ist, als hätte mein Testskript nicht genug Zeit gehabt, den Signalhandler zu installieren, bevor er abgeschossen wurde.
Ein Testskript:
$ echo '$SIG{USR1} = sub { print "GOT SIGNAL\n" }; sleep 100' > sigtest.pl
Sofort abschießen: (der Ruhezustand ist vorhanden, sodass die nächste Eingabeaufforderung nicht sofort gedruckt wird)
$ perl sigtest.pl & kill -USR1 $! ; sleep 1
[1] 8825
[1]+ User defined signal 1 perl sigtest.pl
Es wurde nichts gedruckt, aber das Signal wurde abgebrochen. Geben wir ihm etwas Zeit:
perl sigtest.pl & ( sleep 0.5 ; kill -USR1 $! )
[1] 8827
GOT SIGNAL
[1]+ Done perl sigtest.pl
Jetzt hat es funktioniert, der Signalhandler wurde ausgelöst. (Das Signal hat unterbrochen sleep
, sodass das Skript trotzdem beendet wurde.)