Signalbehandlung in einer shell-Skript
Folgenden ist ein shell-Skript (myscript.sh) ich habe:
#!/bin/bash
sleep 500 &
Aprogram arg1 arg2 # Aprogram is a program which runs for an hour.
echo "done"
Startete ich das in einem terminal, und von einem anderen terminal gab ich 'kill -INT 12345'. 12345 ist die pid myscript.sh.
Nach einer Weile kann ich sehen, dass beide myscript.sh und Aprogram tot gewesen. Allerdings 'sleep 500 &' noch läuft.
Kann mir jemand erklären, warum dieses Verhalten?
Auch, wenn ich ausgestellt, ein SIGINT signal an den 'myscript.sh' was genau ist passiert? Warum ist 'Aprogram' getötet und warum nicht 'schlafen' ? Wie ist das signal INT immer übertragen es ' s child-Prozesse?
Was genau ist der beabsichtigte Zweck
sleep 500 &
überhaupt? Scheint ein relativ Wertloser Abfall eines Prozesses...InformationsquelleAutor ernesto | 2014-04-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sobald
Aprogram
fertig istmyscript.sh
Drucke "Fertig" und wird auch finised.sleep 500
bekommt der Prozess mit der PID 1, als ein Elternteil. Das ist es.SIGINT ist nicht geliefert zu
Aprogram
wennmyscript.sh
es bekommt. Verwendenstrace
um sicherzustellen, dassAprogram
kein signal empfängt.Ich dachte zuerst, dass es ist die situation, wie wenn ein Benutzer drückt Strg + C, und Lesen Sie diese http://www.cons.org/cracauer/sigint.html. Aber es ist nicht genau die gleiche situation. In Ihrem Fall shell received SIGINT, aber der untergeordnete Prozess nicht. Aber shell hatte in diesem moment ein Kind-Prozess, und es Tat nichts und wartete darauf, ein Kind. Dies ist strace-Ausgabe auf meinem computer nach dem senden von SIGINT an ein shell-Skript zu warten, für ein Kind-Prozess:
Soweit ich sehen kann, mit
strace
Kind-Programm wie IhreAprogram
ist nicht immer getötet. Es nicht erhalten haben, SIGINT und beendet sich normal. Sobald es fertig Ihr shell-Skript auch fertig.shell waits for Aprogram to complete, but won't wait for sleep
. Gut, es ist, weil der&
dass Sie nachsleep
. Bitte Lesen Sie en.wikipedia.org/wiki/....InformationsquelleAutor Sergei Kurenkov
Starten Sie
sleep
im hintergrund. Als solche, es wird nicht getötet, wenn Sie die töten Skript.Wenn Sie wollen, zu töten
sleep
auch wenn das Skript beendet ist, werden Sie brauchen, umtrap
.Jetzt senden
SIGINT
zu Ihrem Skript verursachen würdesleep
zu kündigen.Ein hintergrund-job ist eine verschiedenen Prozess insgesamt. Als solche, unter Angabe der PID des scripts würde nicht löschen. Bezüglich der anderen Frage, was muss Sie beachten, wenn Sie senden
SIGINT
zu einem Skript, enthält nur dieAprogram
Befehl?Nach dem senden von SIGINT via "kill -INT pid', myscript.sh immer noch existiert, und Aprogram auch weiterhin zu drucken, die Ausgabe, es sei denn, es ist wirklich abgeschlossen, es ist die Ausführung. Bitte beachten Sie die Methode des Tötens, es ist nicht Strg+c , es ist mit dem 'kill -INT pid". Dies scheint zu haben eine andere Wirkung.
Ja, ich verstehe, dass
SIGINT
ist nichtSIGKILL
oderSIGHUP
. Würden Sie brauchen, um zu starten der andere Prozess in den hintergrund zu erfassen und es ist PID übergebentrap
. Siehe das update oben.InformationsquelleAutor devnull
Müssen Sie
trap
zu fangen Signale:Einfach zu ignorieren, SIGINT verwenden:
wenn Sie angeben möchten, einige spezielle Aktion für diese kann man es machen, dass in der Zeile:
oder besser wickeln Sie es in eine Funktion
und wenn Sie möchten, dass Ihre Skript zu beenden alle seine Aufgaben zuerst:
Wenn der Elternteil stirbt, als es die Kinder noch ausgeführt werden. Es ist das normale Verhalten. Sie können sehen, wie es aussieht mit
pstree -aup
Aber hier in diesem Fall, nach myscript.sh erhalten SIGINT, es wartet Aprogram zu vervollständigen und dann beide von Ihnen sterben. Aber der Traum bleibt bestehen. Ein Kind wird getötet und der andere nicht. Es ist ein Prozess im hintergrund, aber immer noch myscript.sh ist es die Eltern.
jeder Prozess ist Kind seiner Eltern, außer der init mit pid 1 (um ehrlich zu sein sogar init hat seine Eltern
start_init
aber das ist eine andere Geschichte)Ich in das gleiche problem wie du. Dann fand ich this
InformationsquelleAutor pawel7318