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

Diskutiere while-Bedingung wird nicht (richtig) überprüft? im Shell-Skripte Forum im Bereich Programmieren unter Linux/Unix; Heyho, ich habe ein kleines Backupscript zum rsyncen auf den Server ihr zu Hause im Netzwerk gebastelt. Das soll dann via cronjob laufen. An...

  1. #1 daboss, 21.01.2009
    Zuletzt bearbeitet: 21.01.2009
    daboss

    daboss Keine Macht für niemand!

    Dabei seit:
    05.01.2007
    Beiträge:
    1.294
    Zustimmungen:
    0
    Ort:
    sydney.australia.world
    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 ;)
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Gott_in_schwarz, 21.01.2009
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    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..
     
  4. daboss

    daboss Keine Macht für niemand!

    Dabei seit:
    05.01.2007
    Beiträge:
    1.294
    Zustimmungen:
    0
    Ort:
    sydney.australia.world
    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.
     
Thema:

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

Die Seite wird geladen...

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

  1. PATH wird nicht richtig durchsucht

    PATH wird nicht richtig durchsucht: Hi zusammen, ich nutze das Forum schon seit längerem , allerdings hat mir bis jetzt immer die Suchfunktion weitergeholfen. Bei meinem aktuellen...
  2. Suse: Tomas Di Giacomo wird neuer CTO

    Suse: Tomas Di Giacomo wird neuer CTO: Suse hat seinen Vorstand um Dr. Tomas Di Giacomo erweitert, der als Chief Technology Officer ab sofort dem Unternehmen angehört. In der neu...
  3. Edubuntu wird nicht mit Ubuntu 16.04 veröffentlicht

    Edubuntu wird nicht mit Ubuntu 16.04 veröffentlicht: Die Bildungs-Distribution Edubuntu, die zum offiziellen Ubuntu-Veröffentlichungszyklus zählt, wird im April keine neue Version herausgeben. Die...
  4. Edubuntu wird nicht mit Ubuntu 16.04 veröffentlicht

    Edubuntu wird nicht mit Ubuntu 16.04 veröffentlicht: Die Bildungs-Distribution Edubuntu, die zum offiziellen Ubuntu-Veröffentlichungszyklus zählt, wird im April keine neue Version herausgeben. Die...
  5. Animations-Software Toonz wird freie Software

    Animations-Software Toonz wird freie Software: Die Animations-Software Toonz wird in Kürze unter einer freien Lizenz erscheinen. Das hat der Hersteller Digital Video angekündigt, nachdem er die...