Executar um comando até que ele pare de falhar

7

Eu quero executar um comando até que ele seja concluído com êxito e, em seguida, pare. Eu sei que posso configurar um loop bash para fazer isso, mas estou curioso para saber se há alguma maneira portátil de fazer isso semelhante a watch -n5 que faria o que estou procurando.

O caso de uso: estou tentando conectar-me via SSH a um servidor que talvez ainda não esteja ativo.

    
por Stefan Mai 27.09.2011 / 23:07

5 respostas

4

Apenas insira o referido laço bash em um script, usando $1 para especificar o comando real a ser executado e $2 para um valor de suspensão arbitrário. Fazendo isso, você poderá executar o comando como:

$ reallyrunit "ls" 5
    
por 27.09.2011 / 23:26
5
# xxx.xxx.xxx.xxx = ipaddr ssh host
until [ 'nmap --open -p 22 xxx.xxx.xxx.xxx |grep -c "ssh"' -eq 1 ]
do 
sleep 4
done 

# ssh stuff here
    
por 28.09.2011 / 00:44
1

Eu não estou ciente de um builtin para isso, mas o bash para usar é algo como:

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: Adicionado data e comentário para que você possa acompanhar quanto tempo ele falhou.

    
por 27.09.2011 / 23:59
0

Eu estruturaria isso em um loop bash. Eu suponho que você também pode pesquisar o sistema (ping, nmap ou outro) para determinar o estado do serviço e se conectar com sucesso.

    
por 27.09.2011 / 23:23
0

Você pode definir o valor de saída para um valor diferente de zero e, em seguida, fazer um loop até que o comando retorne com uma saída 0 (sucesso). Aqui está um script que eu tenho que faz isso:

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

Não é o melhor dos scripts - foi mais uma experiência de pensar que o rsync será reiniciado quando falhar até que tenha terminado com sucesso.

Editar: no seu caso, você provavelmente quer algo como:

#!/bin/sh

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

Você pode adicionar condições de erro aqui e ali, mas o importante é conectar-se imediatamente depois de verificar se a porta está aberta, que é o que o & & a operação é para - ele executará o próximo comando se o comando anterior foi bem-sucedido. (Até lá, uma conexão com falha retornará um código de saída diferente de zero, o que fará com que o loop continue). Depois de fazer o login com sucesso e, em seguida, efetuar logout, o código de saída retornado dessa sessão de login bem-sucedida encerrará o loop.

(o comando sleep é opcional, mas note que em alguns casos, sem um loop de sleep, o monitor pode ficar lento até que você o minimize ou mude para a próxima janela, o que pode ser um problema se o seu display for remoto área de trabalho)

    
por 28.09.2011 / 01:30