Esegui un command finché non smette di fallire

Voglio eseguire un command finché non si completi con successo, quindi interrompere. So che posso impostare un ciclo di bash per farlo, ma sono curioso se ci sono modi porttili per farlo simile a watch -n5 che farà quello che sto cercando.

Il caso d'uso: Sto cercando di connettersi tramite SSH a un server che potrebbe non essere ancora in uso.

  • Apache crash; "Troppi file aperti nel sistema"
  • Sintassi di Linux Bash: Significato di &&, \ e -
  • PYTHONPATH variabile d'ambiente ... come faccio ad each subdirectory successivamente?
  • Quale significato ha l'utente / host alla fine di un file di chiave pubblica SSH?
  • vantaggi nella chiusura di un porto in cui non sono in esecuzione servizi
  • Gateway e router su un computer
  • 5 Solutions collect form web for “Esegui un command finché non smette di fallire”

    Basta avvolgere detto loop bash in uno script, usando $1 per specificare il command effettivo da eseguire e $2 per un valore di sonno arbitrario. Facendo questo, sarai in grado di eseguire il command come:

     $ reallyrunit "ls" 5 
      # xxx.xxx.xxx.xxx = host ipaddr ssh
     fino a [`nmap --open -p 22 xxx.xxx.xxx.xxx | grep -c" ssh "` -eq 1]
     fare 
     dormire 4
     fatto 
    
     # ssh stuff qui
    

    Non sono a conoscenza di un builtin per questo, ma il bash da usare è qualcosa di simile:

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

    EDIT: Aggiunta di date e commento in modo da poter monitorare quanto tempo è in corso di fallimento.

    Lo strutturerei in un ciclo di bash. Suppongo di poter anche eseguire il polling del sistema (ping, nmap o altro) per determinare lo stato del servizio e connettersi se è successo.

    È ansible impostare il valore di output su un valore diverso da zero e quindi eseguire lo svolgimento fino a quando il command restituirà con un'output 0 (success). Ecco uno script che ho quello che fa:

     #!/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 

    Non il meglio degli script – era più di un esperimento di pensiero di garantire che il rsync si riavvii quando non riesce finché non sia finito con successo.

    Modifica: nel tuo caso, probabilmente vuoi qualcosa di simile:

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

    È ansible aggiungere condizioni di errore qua e là, ma la cosa importnte è collegarsi immediatamente una volta verificata che la port sia aperta, cosa è l'operazione && – eseguirà il command successivo se il command precedente è riuscito. (Fino ad allora, una connessione non rioutput restituirà un codice di output non zero, che causerà il ciclo continuo). Una volta eseguito l'accesso correttamente e quindi disconnesso, il codice di output che viene restituito da quella session di login corretta chiude il ciclo.

    (il command di sleep è opzionale, ma si noti che in alcuni casi, senza un loop di sonno, il display potrebbe rallentare fino a quando non si riduca o si passa alla window successiva, che potrebbe essere un problema se il tuo schermo è un desktop remoto)

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.