trap ctrl-c in bash

Manche Scripte laufen lang, manche sogar so lange, bis sie extern unterbrochen werden, etwa durch ein ctrl-c, das ein SIGINT an das Script sendet. Dieses Script tut gar nichts und läuft und läuft und läuft…

while true; do :; done

Mit einem ctrl-c beende ich den Spuk. Wenn ich aber vor dem Beenden noch einen Befehl absenden will, muss ich das SIGINT abfangen. Und am einfachsten fängt man mit einer Falle, einem trap:

#!/bin/bash

trap BeendeMich SIGINT

function BeendeMich {
echo ""
echo "Du hast ctrl-c gedrueckt! Ich verschwinde..."
exit 0
}

while true; do :; done

Das ist der output des Beispiels:

^C
Du hast ctrl-c gedrueckt! Ich verschwinde...

Man muss keine Funktion aufrufen, man kann auch direkt  Befehle hinter trap eingeben von Anführungszeichen umgeben. Da aber immer mindestens zwei Befehle übergeben werden sollten (Neben dem eigenen noch ein abschliessendes exit, denn sonst beendet sich das script nicht), ist eine Funktion sauberer. Die kann man etwa nutzen, um Lockfiles oder andere temporäre Dateien zu löschen, bevor das Script beendet wird.

trap kann auch noch mehr SIGs abfangen. Einfach mal folgenden Befehl eingeben und man bekommt eine Liste mit SIGs angezeigt:

trap -l

Man kann mehrere SIGs hinter das trap schreiben. Wenn man etwa alle üblichen Unterbrecher abfangen will, dann geht das im obigen Beispiel so:

trap BeendeMich SIGINT SIGTERM SIGHUP
Advertisements
trap ctrl-c in bash

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s