Shell-Script trotz Fehlern weiterlaufen lassen

Blutschlumpf

Fleet Admiral
Registriert
März 2001
Beiträge
20.625
Habe folgendes Problem:

beim Booten versuche ich über die rc.local ein OpenVPN-Interface hinzuzufügen:
"/usr/sbin/tunctl -t tap0"
Das funktioniert wie mir scheint, erzeugt aber einen Fehler ("TUNSETIFF: Device or resource busy"). Leider bricht das Script dann an der Stelle ab statt weiter zu laufen.
Kann man das irgendwie verhindern und den Ausgang ignorieren ?
 
Puh, welche der 1000 Möglichkeiten willst du?

Hier ein Auszug aus dem Init-Script was das tun müsste was du suichst:
Code:
tap="tap0 tap1 tap2 tap3 tap4 tap5 tap6 tap7 tap8 tap9 tap10 tap11 tap12 tap13"

start() {
  ebegin "Starting openvpn-bridging interfaces"

        for t in $tap; do
        openvpn --mktun --dev $t
        ifconfig $t 0.0.0.0 promisc up
        done


  eend $?
}

stop() {
  ebegin "Stopping openvpn-bridging interfaces"

        for t in $tap; do
            openvpn --rmtun --dev $t
        done

  eend $?
}
 
Mir geht es nicht drum nen anderen Befehl zu suchen der evtl. keinen Fehler erzeugt ("openvpn --mktun --dev tap0" bricht bei mir übrigens auch ab ;)) sondern dass das Script auch mit Fehlern weiterläuft.
Ich frage mich eh warum das überhaupt passiert, afaik wäre das weiterlaufen doch das normale Verhalten oder habe ich da jetzt ein Brett vorm Kopf ?
 
Du könntest versuchen mit '&' den Prozess in den Hintergrund zu verschieben. Ich vermute nämlich das kein korrektes Return-Signal kommt und somit das Skript an der Stelle zum erliegen kommt. Bleibt dann halt nur das Problem, wenn der Rest vom Skript darauf aufbaut. Dann käme evtl noch ein 'sleep' in Frage. Aber optimal ist das nicht.
 
Ein Shellscript bricht doch eigentlich nicht ab. Das ist wie eine Batchdatei welche einen Befehl nach dem andern ausführt, solange keine Kontrollstrukturen dies verhindern.

Erst wenn das Programm mit einem Exit-Status >0 beendet wird, dann kommt ggf. eine Fehlermeldung.

Sonst ruf aus dem Init-Script dein Start-Script auf:
Code:
/bin/sh /usr/local/bin/start-openvpn-bridge
 
Richtig. Es bearbeitet einen Befehl nach dem nächsten.
1. Befehl ... Exit success/fail -> 2. Befehl... Exit success/fail -> 3. Befehl... usw.
ich schätze irgendwann liefert ein Aufruf kein Exit zurück. Darauf wartet das Skript aber. Und mit '&' kann man das verhindern.
 
Ich hatte gerade an einer anderen Stelle ein ähnliches Problem:
Ich starte über die /etc/rc.local ein Script welches wiederum ein killall ausführt auf einen Prozessnamen zu dem nichts käuft.

Nach dem ich jetzt Zeile für Zeile durchgegangen bin, scheine ich die Lösung gefunden zu haben.

Per default startet /etc/rc.local mit:
"#!/bin/sh -e"

Diese Version bricht bei jedem Fehler ab.

Wenn man das "-e" allerdings wegnimmt, also nur noch "#!/bin/sh" da steht, funktioniert das ganze.

Hat jemand ne Ahnung ob das weglassen noch etwas anderes verursacht ?
In der Manpage zu sh wird der Parameter wie es mir scheint nicht erwähnt.
 
Zuletzt bearbeitet:
Ja ein "einfaches"
Code:
sh -c "help set"
gibt:
-e Exit immediately if a command exits with a non-zero status.
Also genau das gewünschte Verhalten, dass rc.local trotz Fehler weiter läuft.

Gruß, Axel
 
Eigentlich umgekehrt, genau das nicht gewünschte Verhalten, aber das war was ich gesucht habe. ;)
 
*schmunzelt*

dann ist set +e das was du suchst ;)
schalter mit set lassen sich so negieren
 
Zurück
Oben