while-Bedingung wird nicht (richtig) überprüft?

daboss

daboss

Kaiser
Heyho,

ich habe ein kleines Backupscript zum rsyncen auf den Server ihr zu Hause im Netzwerk gebastelt. Das soll dann via cronjob laufen.

An einer Stelle prüfe ich, ob der Server läuft. Tut er das nicht, wird er über WOL gestartet und das Script soll warten, bis die Kiste via ssh erreichbar ist. Das übernimmt der folgende Teil:

Code:
##
#Falls der Rechner heruntergefahren ist, wird versucht, ihn hochgefahren.
#Falls der Rechner erst hochgefahren werden muss,
#wird er hernach auch wieder heruntergefahren:
##
SHUTDOWN="";
if ! ssh $SSH_USER@$SSH_IP -p$SSH_PORT ls > /dev/null 2> /dev/null; then
    echo "[$(date)] Backup-Rechner ist nicht erreichbar. Versuche, ihn jetzt ";
    echo "hoch zu fahren. Bitte 20 bis 30 Sekunden gedulden.";

    wakeonlan $SSH_MAC
    
    #Warten bis der Rechner da ist:
    VERSUCHSSTART=$(date +%s);
    while ! ssh $SSH_USER@$SSH_IP -p$SSH_PORT ls > /dev/null 2> /dev/null; do

               #Ausgabe nur zum checken, ob die Var's passen...
        echo "ssh $SSH_USER@$SSH_IP -p$SSH_PORT ls > /dev/null 2> /dev/null";

        #Timout respektieren, ggf. abbrechen:
        JETZT=$(date +%s);
        DIFF=$((JETZT - VERSUCHSSTART));
        if [ "$DIFF" -ge "$TIMEOUT" ]; then
            echo "[$(date)] Timeout erreicht. Script wird abgebrochen";
            exit 1;
        fi;
        
        echo ".";
        sleep 10;
    done;
    
    echo "[$(date)] Der Backuprechner ist jetzt bereit.";

    SHUTDOWN="j";
fi;
So, er bemerkt korrekterweise, das der Rechner ist aus ist, und startet ihn. (Er bemerkt auch, das der Rechner läuft, und macht dann korrekt weiter, nur als Info am Rande.) Aber er bleibt so lange in der while-Schleife, bis das Script nach $TIMEOUT Sekunden abbricht. Laut der mitlaufenden Debug-Ausgabe sind die ganzen Variablen korrekt belegt, und im echo "schaut der Befehl richtig aus". Nämlich [code[ssh alex@192.168.168.19 -p22 ls > /dev/null 2> /dev/null[/code]

Lasse ich nur die while-Schleife (statt mit den Variablen mit den richtigen Parametern) direkt als Einzeiler im Terminal laufen, dann funktioniert das ganze. (Hier habe ich mich vorhin getäuscht, und meine Aussage jetzt angepasst :) Sorry.)

Spiele ich aber selbst im Terminal while-Schleife (Sprich: ich setzte manuell immer wieder einen ssh-Aufruf ab), komme ich aber auch sehr wohl (und auch locker innerhalb von $TIMEOUT) auf den Rechner :think:

Jetzt würde mich interessieren, wieso das mit der Schleife nicht hinhaut. Kann mir da jemand helfen, und sagen, wo mein Fehler liegt?

/Edit: Die while-Schleife als Terminaleinzeiler funktioniert doch. Aber im Script geht's leider wirklich nicht :(
/Edit: Das ganze als Bash-Script ;)
 
Zuletzt bearbeitet:
Vielleicht mal alles, was genau ein Argument sein soll auch als ein Argument quoten? kA, sollte eigentlich nicht mal nötig sein..
Und am Rande
Code:
2>/dev/null 1>&2
tippt sich schneller.

Das Ausrufezeichen macht mir sonst noch Angst, aber das ist afair Historyexpansion und wäre wenn überhaupt nur interaktiv ein Problem.. Hm.
Vielleicht statt alles nach /dev/null umzuleiten einfach mal in irgendein logfile? Kann sicherlich nicht schaden..
 
Haha, ok, scheins hat er via crontab nen Autorisierungsproblem:

Code:
Permission denied (publickey,password).

Ich hab nicht daran gedacht, das ich das Keyfile mit Passwort geschützt hatte... den PW-Schutz hab ich wieder weggenommen, jetzt geht's auch via crontab.

Hm. Aber irgendwie find ich's komisch. das es, von Hand gestartet, funktioniert hatte, das Script, und in der ct nicht.
 

Ähnliche Themen

Log-Datei bearbeiten

Hilfe für ein shell script

script sshpass

Verschlüsseltes Backup-Script mit rsync

Port generieren, wenn nicht dann

Zurück
Oben