Erst du, dann du, dann du, dann du
Synchronisation von Jobs in der Shell
Probleme und Einschränkungen
Ein Problem gibt es noch, das mit folgendem Aufruf deutlich wird:
01 echo "=====" \ | in_pipe false \ | in_pipe sleep 1 02 echo $?
Das Problem wird in der letzten Zeile der Ausgabe offenbar:
===== Mi 21. Jan 10:09:08 CET 2015 false ----- ----- RESULT=1 Mi 21. Jan 10:09:08 CET 2015 ===== Mi 21. Jan 10:09:08 CET 2015 sleep 1 ----- ----- RESULT=0 Mi 21. Jan 10:09:09 CET 2015 ===== 0
Die Ausgabe zeigt: Obwohl ein Job einen Fehlerwert gemeldet hat, registriert die Shell diesen nicht, weil der letzte Job in der Pipe ohne Fehler endete.
Bei der POSIX- oder Bourne-Shell muss man mit diesem Umstand leben - oder die Ausgabe der Pipe weiter untersuchen. Verwendet man jedoch bash, ksh oder zsh, erscheint folgende Lösungsanweisung im Skript vor der Pipe:
set -o pipefail
Allerdings hat auch diese Lösung Einschränkungen.
- Pro Job lässt sich nur ein Befehl aufrufen. Immerhin kann man Argumente mitgeben.
- Da die Ausgabe der Jobs in Variablen zwischenlagert, sollte die Ausgabe sich auf den maximalen Wert für Shell-Variablen beschränken. Wer mehr braucht, muss mit temporären Dateien arbeiten.
- Keine Ausgabeumleitungen lassen sich an die Funktion durchreichen. Das könnte man allerdings in die Funktion selbst einbauen, wodurch sie für alle Jobs gelten würde.
Wer das im Hinterkopf behält, kann verschiedene Jobs gleichzeitig aufrufen, ohne dass sich aufeinanderfolgende Staffeln von Jobs überlappen oder zwischendurch Zeit zu verschenken.
Autoreninformation
Mathias Weidner studierte Ende der 1980-er Jahre Automatisierungstechnik in Leipzig. Nach verschiedenen Stellen in der Software-Entwicklung arbeitet er als Administrator für Unix/Linux, Netzwerke und Sicherheitsthemen. Seit einiger Zeit schreibt er hin und wieder Bücher dazu, die unter http://buecher.mamawe.net zu finden sind.
Dieser Artikel ist zuerst erschienen in UpTimes, Mitgliederzeitschrift des GUUG e.V., Ausgabe 2016-2. Veröffentlichung mit freundlicher Genehmigung.