Rückgabewerte überprüfen

Wenn innerhalb eines Scripts ein Befehl aufgerufen wurde, so kann es für den weiteren Ablauf sehr wichtig sein, ob der Befehl erfolgreich war oder nicht. Diese Frage beantworten uns die Rückgabewerte (exit-codes). Jedes Programm gibt dem Betriebssystem einen ganzzahligen Rückgabewert zurück, wenn es abgeschlossen ist. Ist dieser Wert 0, dann bedeutet es eine fehlerfreie Beendigung des Programms, in allen anderen Fällen bedeutet es einen Fehler.

Das Programm test beispielsweise nutzt diese Fähigkeit, um be stimmte Tests durchzuführen und die Ergebnisse als Rückgabewert (0 bedeutet Test war erfolgreich also wahr) zurückzuliefern.

Die Shell kennt drei Methoden, diesen Rückgabewert zu analysieren:

  • Die Variable $?
    Die Variable $? enthält immer den Rückgabewert des letzten ausgeführten Programms. Sie kann nach dem Aufruf eines Programms z.B. mit der if-Bedingungsüberprüfung abgefragt werden: … Programm if [ $? -eq 0 ] then … # Programm war erfolgreich fi Sobald ein anderes Programm abgelaufen ist, hat die Variable $? aber bereits einen anderen Wert, den des neuen Programms eben.
  • Verknüpfung zweier Programme mit &&
    Wenn zwei Programme mit zwei direkt aufeinanderfolgenden Ampersands (&)verknüpft werden, so wird das zweite Programm nur ausgeführt, wenn das erste mit Rückgabewert 0 abgeschlossen wurde.
  • Verknüpfung zweier Programme mit ||
    Wenn zwei Programme mit zwei direkt aufeinanderfolgenden Pipe-Symbolen (||)verknüpft werden, so wird das zweite Programm nur ausgeführt, wenn das erste mit Rückgabewert ungleich 0 abgeschlossen wurde.

Eine häufig benutzte Zeile, die die dritte Möglichkeit ausnutzt ist

  test -x /usr/bin/foo || exit

Wenn das Programm /usr/bin/foo nicht existiert und ausführbar ist, wird das Script mit exit beendet.

Mail an root unter bestimmten Bedingungen

Ein Script wird häufig automatisch abgearbeitet auch wenn kein User am Terminal anwesend ist. Wenn es jetzt eine Meldung an den Benutzer oder den Systemverwalter ausgeben will, bleibt nur das Mail-System. Oder es soll eine Nachricht an den Systemverwalter abschicken, wenn bestimmte Bedingungen erfüllt sind, auch hier ist die E-Mail die beste Methode. Dazu existiert der Befehl mail.

Dieser Befehl schickt eine Mail mit bestimmter Titelzeile an eine bestimmte Adresse. Die Mail selbst wird entweder aus einer Datei oder aus einem Here-Dokument von der Standard-Eingabe gelesen. Im Script ist die Form des Here-Documents am verbreitetsten:

  mail  -s Titel Adresse  <<EOM
    Beliebige Textzeilen 
  EOM  

Alles, was zwischen den beiden EOMs steht, wird an die angegebene Adresse per Mail verschickt. Beinhaltet der Titel Leerzeichen, so muß er in Anführungszeichen gesetzt werden. Als Adresse für den Systemverwalter kann einfach root eingegeben werden:

  #!/bin/bash
  Auslastung=`df /dev/hda1| grep ^/ |cut -c52-54`  
  if [ $Auslastung -gt 90 ]
  then
    mail -s "Alarm: Platte bald voll" root <<EOM
      Hallo Systemverwalter. Die Platte /dev/hda1 ist bald voll.
      Sie ist zu $Auslastung Prozent belegt.
      Mach was!!!
    EOM
  fi

Es können aber auch Programme direkt ihre Ausgaben an mail weiterpipen, also etwa

  df | mail -s "Ausgabe von df" root

In beiden Fällen wird eine Mail an root verschickt, im ersten Beispiel, wird eine Warnung an root weitergegeben, wenn die Platte /dev/hda1 voller als 90% ist, im zweiten wird einfach die Ausgabe von df gemailt.

Speicherort von Scripts

Scripte sind nur dann ausführbar, wenn sie innerhalb des Suchpfades liegen. Bei der Wahl einer geeigneten Stelle für eigene Scripts sollte unterschieden werden, wofür sie gedacht sind.

Soll nur der Systemverwalter diese Scripts ausführen dürfen, dann empfiehlt es sich,

  1. die Scripts entweder in /usr/local/sbin oder /root/bin abzuspeichern. Beide Verzeichnisse liegen nur im Suchpfad des Systemverwalters.
  2. die Zugriffsmodi auf 700 zu setzen (rwx—), und dafür zu sorgen, dass sie root gehören. Somit kann sie nur root ausführen.

Sollen sie aber von allen Usern ausführbar sein, so sollten sie nach /usr/local/bin gelegt werden und den Zugriffsmodus 755 (rwxr-xr-x) besitzen. /usr/local/bin ist im Suchpfad aller User.

Grundsätzliche Vorsicht ist mit der Verwendung des SUID-Bits angeraten. Die Shell reagiert aber seit einigen Jahren sehr vorsichtig darauf und bezieht sich ihre Informationen über die Identität nicht aus der Effektiven UID sondern aus der echten UID. Ältere Versionen können hier aber erhebliche Schwierigkeiten machen\dots{}