Führen Sie einen Befehl aus, bis er nicht mehr funktioniert

7

Ich möchte einen Befehl ausführen, bis er erfolgreich abgeschlossen wurde, und dann anhalten. Ich weiß, dass ich eine Bash-Schleife einrichten kann, um dies zu tun, aber ich bin gespannt, ob es tragbare Möglichkeiten gibt, dies zu tun, ähnlich wie watch -n5das, wonach ich suche.

Der Anwendungsfall: Ich versuche, über SSH eine Verbindung zu einem Server herzustellen, der möglicherweise noch nicht aktiv ist.

Stefan Mai
quelle

Antworten:

4

Schließen Sie die Bash-Schleife einfach in ein Skript ein, $1um den tatsächlich auszuführenden Befehl und $2einen beliebigen Schlafwert anzugeben . Auf diese Weise können Sie den Befehl wie folgt ausführen:

$ reallyrunit "ls" 5
EEAA
quelle
5
# xxx.xxx.xxx.xxx = ipaddr ssh host
bis [`nmap --open -p 22 xxx.xxx.xxx.xxx | grep -c" ssh "` -eq 1]
tun 
Schlaf 4
erledigt 

# ssh Zeug hier
Bart
quelle
1

Ich bin mir nicht bewusst, dass dies so eingebaut ist, aber die zu verwendende Bash ist ungefähr so:

RET=1;until [[ $RET = 0 ]];do echo "$(date): About to make an attempt to connect"; ssh 192.168.33.12; RET="$?";sleep 1;done

BEARBEITEN: Datum und Kommentar hinzugefügt, damit Sie verfolgen können, wie lange es fehlgeschlagen ist.

Jed Daniels
quelle
0

Ich würde dies in einer Bash-Schleife strukturieren. Ich nehme an, Sie könnten auch das System (Ping, Nmap oder auf andere Weise) abfragen, um den Dienststatus zu ermitteln und bei Erfolg eine Verbindung herzustellen.

ewwhite
quelle
0

Sie können den Exit-Wert auf einen Wert ungleich Null setzen und dann eine Schleife ausführen, bis der Befehl mit einem Exit 0 (Erfolg) zurückkehrt. Hier ist ein Skript, das das hat:

#!/bin/sh

cd /exports/home/exports/sl
$(exit 1)


while [ $? != 0 ]; do rsync -avlH --delete  --exclude=6.1/archive --exclude=6.1/i386/archive --exclude=6.1/x86_64/archive --exclude=6.1/i386/iso --exclude=
6.1/x86_64/iso rsync://rsync.gtlib.gatech.edu/scientific/6.1 6.1/; done

Nicht das beste Skript - es war eher ein Gedankenexperiment, um sicherzustellen, dass rsync neu gestartet wird, wenn es fehlschlägt, bis es erfolgreich abgeschlossen wurde.

Bearbeiten: In Ihrem Fall möchten Sie wahrscheinlich etwas wie:

#!/bin/sh

$(exit 1) ; while [ $? != 0 ]; do sleep 1 ; nc -vvv  -z 192.168.15.37 22  && ssh 192.168.15.37  ; done

Sie können hier und da Fehlerbedingungen hinzufügen, aber das Wichtigste ist, sofort eine Verbindung herzustellen, sobald Sie überprüft haben, dass der Port geöffnet ist. Dafür ist die Operation && vorgesehen. Wenn der vorherige Befehl erfolgreich war, wird der nächste Befehl ausgeführt. (Bis dahin gibt eine fehlgeschlagene Verbindung einen Exit-Code ungleich Null zurück, wodurch die Schleife fortgesetzt wird.) Sobald Sie sich erfolgreich angemeldet und dann abgemeldet haben, beendet der Exit-Code, der von dieser erfolgreichen Anmeldesitzung zurückgegeben wird, die Schleife.

(Der Befehl sleep ist optional. Beachten Sie jedoch, dass Ihre Anzeige in einigen Fällen ohne Schlafschleife möglicherweise langsamer wird, bis Sie sie entweder minimieren oder zum nächsten Fenster wechseln. Dies kann ein Problem sein, wenn es sich bei Ihrer Anzeige um einen Remotedesktop handelt.)

Rilindo
quelle