Bash: Endlich (Versuchen Sie, Mit Ausnahme) Ausnahme
Möchte ich einige Befehle auf das Ende der bash-Skript, auch wenn der Benutzer drücken STRG+C zum Abbrechen die Ausführung.
Ich weiß, ich kann das bash-Skript aus, die innerhalb einer anderen Programmiersprache (zum Beispiel Python), so dass ich verwenden können, die 'endlich' (try-finally) block ausführen von code.
Aber zu wissen, dass StackOverflow ist ein Zentrum für den Austausch von fantastischen Ideen, ich Frage, ob gibt es eine Möglichkeit, das zu tun, was ich will, von innen mein bash-Skript.
So, Ideen?
EDIT:
Was ich will ist, töten Sie jeden Prozess eröffnet, die in meiner bash, d.h., Selen und Xvfb proccesses.
Versuchte ich, diese schriftlich an den code:
trap "selenium_pids=$(ps ux | awk '/selenium/&& !/awk/{print $2}');for pid in $selenium_pids; do kill -9 $pid;done; xvfb_pids=$(ps ux | awk '/Xvfb/&& !/awk/{print $2}'); for pid in $xvfb_pids; do kill -9 $pid; done" EXIT
Aber das verpflichtet mich zu drücken "STRG+C" oft, bei jeder Ausführung des teilvorgangs aus in meinem Skript etwas ähnliches wie:
Testing nsi.bd.helpcenter ...^C: -- Total time: 0min 0seg
Testing nsi.bibliography ...^C: -- Total time: 0min 0seg
Testing nsi.digitallibrary ...^C: -- Total time: 0min 0seg
Testing nsi.digitallibraryinstaller ...^C: -- Total time: 0min 1seg
Testing nsi.digitallibraryskins ...^C: -- Total time: 0min 0seg
....#continues
Ändern das Finale der trap-Linie vom AUSGANG zur SIGINT , wie diese:
trap "selenium_pids=$(ps ux | awk '/selenium/&& !/awk/{print $2}');for pid in $selenium_pids; do kill -9 $pid;done; xvfb_pids=$(ps ux | awk '/Xvfb/&& !/awk/{print $2}'); for pid in $xvfb_pids; do kill -9 $pid; done" SIGINT
Macht das gleiche.
Was jetzt zu beenden auf der ersten STRG+C?
Weil ich versuchte, fügen Sie ein "exit 1" auf das Finale der string , wie
trap "... ;exit 1"
Funktionierte es bis zur Ausfahrt auf der ersten STRG+C, aber nicht getötet, den Prozessen, die ich wollte.
Ideen?
- Für die Lesbarkeit und Wartbarkeit schreiben Sie Ihre trap-handler als multi-line-Funktion wie
func_name () { ...
und Ihretrap
Aussage wie diesetrap func_name SIGINT
. Verwenden Sie nichtkill -9
als letzten Ausweg - Nutzung-SIGTERM
,-SIGQUIT
oder-SIGINT
ersten. Verwendenpkill
wenn Sie es haben, anstelle der Analyseps
. - Ich habe nicht das bekommen, was Sie waren versucht, meine mit der "multi-line-Funktion", aber studieren die pkill mit der richtigen Signale weitergeben. Vielen Dank für das ansehen.
- Die Antwort die du gepostet hast, ist was ich mit "multi-line-Funktion".
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe, was ich wollte mit diesem code:
Ich bin mir bewusst, dass es bessere Ressourcen als die Verwendung von
kill -9
überall.EXIT
undERR
neben dem standard diejenigen. Diese bieten nützliche Ausfahrt catch-alls.Du willst trap-Signale.
Wenn der Nutzer Ctrl-c im terminal den OS-Problemen ein SIGINT an den aktuellen Prozess. Dieses signal kann abgefangen und verarbeitet. Wie Sie das tun, ist ein shell-abhängig Problem, und Sie sollten überprüfen Sie Ihre Muscheln-man-Seite.
Beachten Sie, dass einige Signale können nicht gefangen werden. Insbesondere SIGKILL was
kill -9
sendet.Im Licht der edit: bash Rückgabe der Prozess-ID von Programmen, die Sie starten. Wäre es möglich, erfassen Sie, wie Sie gehen, so dass Sie nicht haben, um eine Analyse der Ausgabe von
ps
. Sie könnten auch erwägen senden Sie die Kinder einige andere signal (vielleicht SIGUSR1) haben bereits eine Falle auf, dass, so dass Sie rekursiv töten Ihre Kinder.Alle, die sagte, Ihr immer in den deep shell-Magie Gebiet. Es gibt einige Bücher, die helfen kann, aber ich weiß nicht, den Titel aus der Spitze von meinem Kopf.