Aparentemente, o MacOs ping
tem uma -o
opção que significa "retornar assim que a primeira resposta bem-sucedida for recebida" ou algo assim. Consulte: https://stackoverflow.com/a/6119327/4561887 .
Existe um equivalente no Linux Ubuntu? Como podemos alcançar melhor o mesmo resultado?
Minha versão é ping utility, iputils-s20161105
, conforme retornado por ping -V
.
Atualização: encontrei a documentação do MacOs aqui: https://ss64.com/osx/ping.html
-o Exit successfully after receiving one reply packet.
Pode haver várias soluções alternativas para tentar fazer com que
ping
se comporte como o do Mac,ping -o
mas há o comandofping
que faz exatamente isso e deve ser usado em scripts e para vários destinos ao mesmo tempo. Do manual :Exemplos:
Usando ping:
c
argumento é para contar pacotes, então você só precisa1
disso -->-c 1
Se você tiver sucesso usando o comando
$?
(status de saída) imediatamente após usar o ping, deverá obter 0 (sucesso, OK). Caso contrário, você obtém1
ou2
digitando$?
, ou seja, error .PING retorna a saída com:
1 received, 0% packet loss
--> sucessoecho $?
retorno 00 received, 100% packet loss
--> falhaecho $?
retorna 1Para loop infinito e STOP quando o serviço estiver disponível, precisa ser pipe in while loop
:
-W1
é para esperar 1 segundocopie isso em um arquivo com o nome
pingo
:
é um comando nulo ou sem efeito, o comando não faz nada ou sai do status sempre é bem-sucedido, neste caso, semelhante a digitar true. É um Bourne Shell embutido$1
argumento significa [endereço de ping neste caso], exemplopingo $1
-> neste caso é um endereço numérico.pingo 192.168.1.68
Isso significa --> criar uma pasta com name
bin
, dentro dessa pasta faça um arquivo com namepingo
e permita a execução do arquivo como programa/home/user/bin
pasta é o padrão para seus próprios programas e pode ser exec no terminal qualquer que seja, assim como pingÉ isso, agora você pode rodar
pingo
com qualquer endereço, assim comoping -o
.Do manual do PING:
Isso torna possível usar o código de saída para ver se um host está ativo ou não .
Após meu próprio estudo, além de revisar as duas outras respostas aqui, concluí: não há equivalente no Linux ao
ping -o
comando que existe no MacOS. Nemping -c 1
nemfping
têm o mesmo comportamento. O melhor que você pode fazer é emular seu comportamento usandofping
ouping
em um loop que retorna assim que o código de retorno de qualquer uma dessas funções for0
, indicando um ping bem-sucedido.Como coloquei no meu comentário aqui :
Então, aproveitando o bom trabalho de @AlexPixel , aqui está minha resposta. Este formulário captura o sinal Ctrl+ Ckill para permitir que você saia com força do
while
loop infinito, garante que você insira um parâmetro para o endereço IP ao executá-lo e imprime uma contagem de tentativas e uma mensagem quando o endereço IP fica ativo.ping_loop.sh :
Torne executável com
chmod +x ping_loop.sh
. "Instale" assim:~/bin
para este script para que você possa executá-lo de qualquer lugar:ping_loop
ougs_ping_loop
diretamente em qualquer lugar que desejar. Isso pressupõe que~/bin
está em seuPATH
. Se estiver usando o Ubuntu e esta for a primeira vez~/bin
que cria , talvez seja necessário sair e fazer login novamente para que seu~/.profile
arquivo tenha efeito, pois ele adicionará automaticamente esse diretório ao seu caminho.Teste com:
Agora você pode ler essas outras respostas aqui para ver como forçar a ativação e desativação desse endereço IP para
ping
teste: Como criar uma interface Ethernet em um endereço IP específico que eu possa pingar e forçar a responder às vezes e às vezes não? .Uma abordagem é esta:
Saída de amostra. Comecei com o tráfego bloqueado através do comando acima e, em seguida, desbloqueei-o com o outro comando acima para
ping
passar e permitir que o script terminasse. Você pode ver a== DEVICE AT IP '10.0.0.1' IS ALIVE! ==
impressão no final.Aqui está minha forma final de ping_loop.sh no meu repositório eRCaGuy_dotfiles : https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/ping_loop.sh <-- é aqui que vou manter as últimas e mais- versão atualizada deste código!
Veja também:
ping_loop
script acima: Como criar uma interface Ethernet em um endereço IP específico que eu possa fazer ping e forçar às vezes a responder e às vezes não?