PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bash-script mit unter-script beendet sich



freisei
03-09-2008, 09:06
Hallo erstmal :)

Ich hab hier ein script, das versucht mit Fehlern von smbmount im unterscript (nethddmounttry) korrekt umzugehen.

Leider haut



tmpfile=/tmp/NETHDDMOUNTSTATE

for i in `seq 1 5`; do
echo "Mountversuch $i..."
scriptdir=`dirname $0`
trycmd=$scriptdir/nethddmounttry
($trycmd &);
echo "Warte 65 sekunden..."
sleep 65
state=`cat $tmpfile`
echo state: $state
if [ "$state" == "MOUNTING" ]; then
echo smbmount vermutlich aufgehängt. Killing and restarting.
kill -9 `cat /var/run/nethddmounttry`
fi
if [ "$state" == "MOUNTEDAFTERTRYUNMOUNT" ] || [ "$state" == "FILESOPEN" ] || [ "$state" == "OK" ] ; then
echo "mount OK mit state: "$state
exit 0
fi
done

echo nethddmount: fehlgeschlagen mit state: $state
exit 1



leider hauts mich nach ner weile raus. Wenn ich die Wartezeit im sleep auf 10 sek. runtersetze passiert das nicht. Muss also irgendwie an so ner art Maximaler Ausführungszeit liegen. Gibts das?

hier mal die Ausgabe (vom unterscript kommen die pings, die anderen ausgaben hab ich gekürzt)



server1:~/scripts# ./backup_data_nethdd
/dev/drbd0 on /srv/dataA type ext3 (rw)
Mountversuch 1...
Warte 65 sekunden...
backup verlauf
PING 192.168.1.211 (192.168.1.211) 56(84) bytes of data.
From 192.168.1.11 icmp_seq=1 Destination Host Unreachable

--- 192.168.1.211 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

PING 192.168.1.212 (192.168.1.212) 56(84) bytes of data.
From 192.168.1.11 icmp_seq=1 Destination Host Unreachable

--- 192.168.1.212 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

FEHLER: konnte 192.168.1.211 oder 192.168.1.212 nicht pingen
state: PINGFAILED
Mountversuch 2...
PING 192.168.1.211 (192.168.1.211) 56(84) bytes of data.
From 192.168.1.11 icmp_seq=1 Destination Host Unreachable

--- 192.168.1.211 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

PING 192.168.1.212 (192.168.1.212) 56(84) bytes of data.
From 192.168.1.11 icmp_seq=1 Destination Host Unreachable

--- 192.168.1.212 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

FEHLER: konnte 192.168.1.211 oder 192.168.1.212 nicht pingen
Beendet
server1:~/scripts# ./backup_data_nethdd ~state: PINGFAILED
Mountversuch 3...
Warte 65 sekunden...
PING 192.168.1.211 (192.168.1.211) 56(84) bytes of data.
From 192.168.1.11 icmp_seq=1 Destination Host Unreachable

--- 192.168.1.211 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

PING 192.168.1.212 (192.168.1.212) 56(84) bytes of data.
From 192.168.1.11 icmp_seq=1 Destination Host Unreachable

--- 192.168.1.212 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

FEHLER: konnte 192.168.1.211 oder 192.168.1.212 nicht pingen
state: PINGFAILED
Mountversuch 4...
Warte 65 sekunden...
PING 192.168.1.211 (192.168.1.211) 56(84) bytes of data.
From 192.168.1.11 icmp_seq=1 Destination Host Unreachable

--- 192.168.1.211 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

PING 192.168.1.212 (192.168.1.212) 56(84) bytes of data.
From 192.168.1.11 icmp_seq=1 Destination Host Unreachable

--- 192.168.1.212 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

FEHLER: konnte 192.168.1.211 oder 192.168.1.212 nicht pingen
state: PINGFAILED
Mountversuch 5...
Warte 65 sekunden...
PING 192.168.1.211 (192.168.1.211) 56(84) bytes of data.
From 192.168.1.11 icmp_seq=1 Destination Host Unreachable

--- 192.168.1.211 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

PING 192.168.1.212 (192.168.1.212) 56(84) bytes of data.
From 192.168.1.11 icmp_seq=1 Destination Host Unreachable

--- 192.168.1.212 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

FEHLER: konnte 192.168.1.211 oder 192.168.1.212 nicht pingen
state: PINGFAILED
nethddmount: fehlgeschlagen mit state: PINGFAILED


ja und dann hängt er... hier. mit strg+c komm ich raus.


anz besonders komisch kommt mir der Abschnitt vor:

FEHLER: konnte 192.168.1.211 oder 192.168.1.212 nicht pingen
Beendet
server1:~/scripts# ./backup_data_nethdd ~state: PINGFAILED
Mountversuch 3...


Hier wird doch irgendwie das Hauptscript beendet, aber die schleift läuft trotzdem weiter...?

auch ps xa bestätigt mir das so...


Wie verhindere ich das beenden mittendrin?

jan61
03-09-2008, 21:47
Moin,

ohne nethddmounttry zu kennen, muss ich ein wenig raten. Mir sind ein paar Stellen in Deinem Script aufgefallen, die mich stutzig machen:

Was soll ($trycmd &); besonderes bewirken? Warum nicht einfach $trycmd &? Warum machst Du da noch eine separate Subshell auf und koppelst damit dein $trycmd vom Hauptscript ab (PPID 1)?

Was passiert, wenn nethddmounttry keinen der in den if-Abfragen getesteten Returncodes liefert? Bist Du sicher, dass es dann auch beendet ist? Bist Du unnerhalb der Schleife sicher, dass nur eine einzige Instanz davon in dein $tmpfile schreibt?

Woher bist Du sicher, dass nach 65 Sekunden die Datei $tmpfile tatsächlich (noch) existiert und dass der Inhalt tatsächlich vom aktuellen nethddmounttry kommt?

Sonst noch:
Die Meldung "Beendet" kommt vielleicht nicht vom Hauptscript, sondern von einem nethddmounttry.

Eine Zeitbegrenzung der Laufzeit gibt es normalerweise nicht.

Um die nethddmounttry-Aufrufe zu steuern, benutze lieber die Jobkontrolle der bash. Also einfach $trycmd & aufrufen und die PID mit LAST_PID=$! merken, dann brauchst Du auch keine /var/run/nethddmounttry-Datei. Stelle in jedem Schleifendurchlauf sicher, dass der nethddmounttry auch tatsächlich beendet ist, notfalls killen.

Das wars, was mir erstmal einfiel.

Jan

EDIT: Versuche auch mal, Dein Script zu debuggen: http://www.jan-trippler.de/de/script_tipps/debug.html

freisei
09-09-2008, 12:34
Hallo erstmal,

sorry fürs spät melden, bekam keine eMail vom Forum dass sich was rührt :)


Moin,

ohne nethddmounttry zu kennen, muss ich ein wenig raten. Mir sind ein paar Stellen in Deinem Script aufgefallen, die mich stutzig machen:

Was soll ($trycmd &); besonderes bewirken? Warum nicht einfach $trycmd &? Warum machst Du da noch eine separate Subshell auf und koppelst damit dein $trycmd vom Hauptscript ab (PPID 1)?

war schon so, war nur ein anderer versuch zwischendurch...


Was passiert, wenn nethddmounttry keinen der in den if-Abfragen getesteten Returncodes liefert? Bist Du sicher, dass es dann auch beendet ist? Bist Du unnerhalb der Schleife sicher, dass nur eine einzige Instanz davon in dein $tmpfile schreibt?


das sollte eigentlich das /var/run/nethddmounttry und das $tmpfile sicherstellen.



Woher bist Du sicher, dass nach 65 Sekunden die Datei $tmpfile tatsächlich (noch) existiert und dass der Inhalt tatsächlich vom aktuellen nethddmounttry kommt?



vom Ablauf her kanns meines erachtens ja nicht anders sein.



Sonst noch:
Die Meldung "Beendet" kommt vielleicht nicht vom Hauptscript, sondern von einem nethddmounttry.


die ausgaben die dann kommen können leider nur vom nethddmounttry kommen..., ich versuchs mal mit getimestampten tmpfile.



Eine Zeitbegrenzung der Laufzeit gibt es normalerweise nicht.

Um die nethddmounttry-Aufrufe zu steuern, benutze lieber die Jobkontrolle der bash. Also einfach $trycmd & aufrufen und die PID mit LAST_PID=$! merken, dann brauchst Du auch keine /var/run/nethddmounttry-Datei. Stelle in jedem Schleifendurchlauf sicher, dass der nethddmounttry auch tatsächlich beendet ist, notfalls killen.

Das wars, was mir erstmal einfiel.

Jan

EDIT: Versuche auch mal, Dein Script zu debuggen: http://www.jan-trippler.de/de/script_tipps/debug.html