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 Ihre trap Aussage wie diese trap func_name SIGINT. Verwenden Sie nicht kill -9 als letzten Ausweg - Nutzung -SIGTERM, -SIGQUIT oder -SIGINT ersten. Verwenden pkill wenn Sie es haben, anstelle der Analyse ps.
  • 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".
Schreibe einen Kommentar