21.062012

Hintergrundprozesse mit begrenzter Lebensdauer

Ein nützliches kleines Tool hat vor einiger Zeit in die GNU coreutils mit Version 7 Einzug gehalten und sollte damit auf den meisten Systemen automatisch vorhanden sein: timeout.

Es kommt im Alltag sehr häufig vor, dass man die Ausführungszeit eines Cronjobs oder anderen Prozesses nicht vorhersagen kann, aber limitieren möchte. In diesem Fall kann man den Prozess mit vorangestelltem timeout starten. Ein (sinnfreies) Beispiel:

> timeout -s USR1 -k 5 10 sleep 60
> echo $?
124
> timeout -s CONT -k 5 10 sleep 60
zsh: killed     timeout -s CONT -k 5 10 sleep 60
> echo $?
137

startet im Hintergrund einen 60 Sekunden schlafenden Prozess. Nach 10 Sekunden bekommt dieser das USR1 Signal (-s USR1) gesendet und beendet sich. Im zweiten Beispiel, wird CONT als Abbruchsignal geschickt, dass der Prozess ignoriert. Nach weiteren 5 Sekunden wird dann das KILL Signal geschickt (-k 5).

Man kann am Exitstatuscode des Prozesses festmachen, ob ein Fehler auftrat, der Prozess ausgetimed ist und das -s Signal bekam, oder (-k) getötet werden musste:

  • 124 Timeout und Beendigung durch das erste Signal
  • 125 Fehler in timeout selbst
  • 126 Das zu startende Programm existiert, kann aber nicht gestartet werden
  • 127 Das zu startende Programm kann nicht gefunden werden
  • 137 KILL musste gesendet werden

Die englische Dokumentation auf gnu.org.