Nehmen wir an, ich habe das script.sh
#!/bin/bash
exit_script() {
echo "Printing something special!"
echo "Maybe executing other commands!"
kill -- -$$ # Sends SIGTERM to child/sub processes
}
echo "Some other text"
#other commands here
sleep infinity
Ich möchte script.sh
die Funktion ausführen, exit_script
wann immer sie empfängt SIGINT
oder SIGTERM
Zum Beispiel:
killall script.sh # it will send SIGTERM to my script
und ich möchte, dass mein Skript dies ausführt
exit_script() {
echo "Printing something special!"
echo "Maybe executing other commands!"
kill -- -$$ # Sends SIGTERM to child/sub processes
}
Ich habe versucht, diese Funktion mit zu implementieren trap
trap exit_script SIGINT SIGTERM
Die Person, die meine Frage beantwortet hat, hat mir das Gegenteil bewiesen.
aber es hat nicht funktioniert, weil trap
es nur auf Signale zu reagieren scheint, die an untergeordnete / untergeordnete Prozesse gesendet werden. Als Anfänger konnte ich die trap
Manpage nicht entziffern , daher habe ich wahrscheinlich die Lösung verpasst.
Ich denke, das ist es, was "echte" Programme wie Chromium tun, wenn Sie sie senden SIGTERM
Von https://major.io/2010/03/18/sigterm-vs-sigkill/
Die Anwendung kann bestimmen, was sie tun möchte, sobald ein SIGTERM empfangen wurde. Während die meisten Anwendungen ihre Ressourcen bereinigen und stoppen, können einige nicht.
Antworten:
trap
reagiert auf die aufrufenden Prozesssignale selbst. Sie müssen es jedoch anrufen, bevor das Signal empfangen wird. Ich meine, am Anfang Ihres Drehbuchs.Wenn Sie außerdem verwenden möchten
kill -- -$$
, das das Signal auch an Ihr Skript sendet, müssen Sie die Falle löschen, bevor Sie den Kill ausführen . Andernfalls endet die Endlosschleife.Zum Beispiel:
Wie in den Kommentaren erläutert, besteht das Problem darin, dass das Skript das Signal empfängt, aber auf das Ende des Ruheprogramms wartet, bevor das empfangene Signal verarbeitet wird. Sie sollten also die untergeordneten Prozesse (in diesem Fall den Schlafprozess) beenden, um die Trap-Aktion auszuführen. Sie können dies mit etwas wie dem folgenden tun:
Oder wie in den Kommentaren angegeben:
quelle
./script.sh & sleep 1 && kill -- -$(pgrep script.sh)
, ein Kill-Signal auch an die untergeordneten Prozesse Ihres Skripts zu senden.