it-swarm-tr.com

Host bilinene kadar linux'da ping nasıl yapılır?

Belirli bir adrese nasıl ping atabilirim ve bulunduğunda ping işlemini durdurabilirim.

Bir bash komut dosyasında kullanmak istiyorum, bu yüzden Ana bilgisayar başlatıldığında, komut dosyası pinglemeye devam ediyor ve Ana bilgisayar kullanılabilir andan itibaren komut dosyası devam ediyor ...

50
Sander Versluys

Martynas'ın cevabının daha da basitleştirilmesi:

until ping -c1 www.google.com >/dev/null 2>&1; do :; done

pingin kendisinin loop testi olarak kullanıldığına dikkat edin; başarılı olur olmaz döngü sona erer. Döngü gövdesi boş, ": "sözdizimi hatasını önlemek için kullanılır.

Güncelleme: Control-C'yi ping döngüsünden temiz bir şekilde çıkarmanın bir yolunu düşündüm. Bu, döngüyü arka planda çalıştırır, kesme (Control-C) sinyalini yakalar ve gerçekleşirse arka plan döngüsünü öldürür:

ping_cancelled=false    # Keep track of whether the loop was cancelled, or succeeded
until ping -c1 "$1" >/dev/null 2>&1; do :; done &    # The "&" backgrounds it
trap "kill $!; ping_cancelled=true" SIGINT
wait $!          # Wait for the loop to exit, one way or another
trap - SIGINT    # Remove the trap, now we're done with it
echo "Done pinging, cancelled=$ping_cancelled"

Biraz dolambaçlı, ancak döngünün iptal edilebilir olmasını istiyorsanız hile yapmalıdır.

87
Gordon Davisson

Bir döngü yapabilir, bir ping gönderebilir ve duruma göre döngüyü kesebilir, örneğin (bash):

while true; do ping -c1 www.google.com > /dev/null && break; done

Bunu betiğinize bir yere koymak www.google.com pinglenebilir.

25
Martynas Saint

Sorunun eski olduğunu biliyorum ... ve özellikle ping ile ilgili sorular soruyor, ancak çözümümü paylaşmak istedim.

Bunu, SSH'yi ne zaman tekrar geri alabileceğimi bilmek için ana bilgisayarları yeniden başlatırken kullanıyorum. (ping, sshd başlatılmadan önce birkaç saniye yanıt vereceğinden.)

until nc -vzw 2 $Host 22; do sleep 2; done
22
Aaron Copley

Hedef Ana Bilgisayara bir kez ping atın. Ping'in başarılı olup olmadığını kontrol edin (ping'in dönüş değeri sıfırdır). Host canlı değilse tekrar ping atın.

Aşağıdaki kod bir dosya olarak kaydedilebilir ve ana bilgisayar adı ile bağımsız değişken olarak çağrılabilir veya ilk ve son satırdan çıkarılabilir ve varolan bir komut dosyasında (waitForHost ana bilgisayar adı) işlev olarak kullanılabilir.

Ping, bir yanıtla sonuçlanmazsa kod başarısızlık nedenini değerlendirmez, bu nedenle Ana Bilgisayar yoksa sonsuza kadar döngü yapar. Benim BSD manpage her dönüş değerinin anlamını listeler, linux biri değil, bu yüzden bu taşınabilir olmayabilir sanırım, bu yüzden bunu dışarıda bıraktım.

#!/bin/bash

PING=`which ping`

function waitForHost
{
    if [ -n "$1" ]; 
    then
        waitForHost1 $1;
    else
        echo "waitForHost: Hostname argument expected"
    fi
}

function waitForHost1
{
    reachable=0;
    while [ $reachable -eq 0 ];
    do
    $PING -q -c 1 $1
    if [ "$?" -eq 0 ];
    then
        reachable=1
    fi
    done
    sleep 5
}
waitForHost $1
11
Jan Jungnickel
UNREACHEABLE=1;
while [ $UNREACHEABLE -ne "0" ]; 
   do ping -q -c 1 Host &> /dev/null; UNREACHEABLE=$?; sleep 1;
done

Uyku 1'i kaldırabilirsiniz, yalnızca Host'un erişilebilir olması ancak ping'in 0 koduyla çıkmaması durumunda herhangi bir sel problemini önlemek için buradadır.

9
radius

Lütfen stackoverflow adresindeki iyi seçeneklere bakın. İşte bash içinde bir örnek, başarılı bir ping sonucu döndürünceye kadar aşağıdaki kod üzerinde döngü yapmanız gerekecektir.


ping -c 1 -t 1 192.168.1.1;
if [ $? -eq 0 ]; then
    echo "192.168.1.1 is up";
else 
    echo "ip is down";
fi
4

yukarıdaki döngülerden herhangi biri, IMO'nun komut dosyalarında ping yapmaktan daha uygun olan ping yerine fping ile de kullanılabilir. Ayrıntılar için fping (1) konusuna bakın.

while ! fping -q $HOSTNAMES ; do :; done

makinelerin üzerinde bir şey yapmadan önce çalışıp çalışmadığını test etmek için de yararlıdır. Basit bir örnek:

 Host1 Host2 Host3 içinde h için; -q $ h fping ise 
 yapın; sonra 
 echo -n "$ h:" 
 ssh $ h "uname -a" 
 fi 
 bitti 
3
cas

BSD ping üzerinde SIGINT'i iyi işlemek için.

Host=google.com NO=1; while [ $NO -ne 0 ]; do ping -W1 -c1 $Host &>/dev/null; NO=$?;echo "$(date) ($Host) $NO" ; done; echo "$(date) ($Host) reachable"

işlev olarak

ping_until(){
  local NO=1
  while [ $NO -ne 0 ]; do
    ping -W1 -c1 $1 &>/dev/null; NO=$?
    # Optionally block ICMP flooding
    # sleep 1
    echo "$(date) ($1) ($NO)"
  done
}
1
Luke Exton

Bu, belirli bir sayıda dener.

t=4; c=0; r=0; until ping -c 1 hostname.com >/dev/null 2>&1 || ((++c >= t)); do r=$?; done; echo $r

Yankılamak yerine $r, test edebilir ve değerine göre hareket edebilirsiniz:

if ((r)); then echo 'Failed to contact Host'; else echo 'Continuing with script'; fi

MacOS kullanıcıları için ping seçeneği -o özellikle bunun için:

-o      Exit successfully after receiving one reply packet.

Yani komut basit:

ping -o www.google.com

Ana Makine bir kez başarıyla pinglendiğinde 0 değerini döndürür.

1
Melebius

Genel olarak veritabanımın veya başka bir sunucumun gelmesini beklemek istiyorum, ama beklemek istemiyorum çok uzun. Aşağıdaki kod 10 saniye bekler, ardından sunucu zaman sınırı içinde görünmediyse çıkış kodunu ayarlar.

Sunucu zaman sınırlamasından önce görünürse, döngü bir sonraki kod bitinin çalışabilmesi için kısa devre yapar.

for i in `seq 1 10`; do date ; sleep 1 ; ping -c1 ${Host} &>/dev/null && break ; done
0
johntellsall

Aşağıdaki işlevi kullanıyorum. Bir süre sonra denemeyi bırakmasını söyleyebilirim çünkü bunu seviyorum:

#!/usr/bin/env bash

function networkup {
  # Initialize number of attempts
  reachable=$1
  while [ $reachable -ne 0 ]; do
    # Ping supplied Host
    ping -q -c 1 -W 1 "$2" > /dev/null 2>&1
    # Check return code
    if [ $? -eq 0 ]; then
      # Success, we can exit with the right return code
      echo 0
      return
    fi
    # Network down, decrement counter and try again
    let reachable-=1
    # Sleep for one second
    sleep 1
  done
  # Network down, number of attempts exhausted, quiting
  echo 1
}

Bir şeyi başlatmak için şu şekilde kullanılabilir:

# Start-up a web browser, if network is up
if [ $(networkup 60 www.google.com) -eq 0 ]; then
  firefox &
fi
0
oneself

Gordon Davisson'un cevabında bir başka gelişme:

until $(ping -c1 www.google.com &>/dev/null); do :; done

çevreleyen '$ ()' ile bir alt kabuk başlatılır ve bu nedenle, Host'un kullanılamaması durumunda döngüyü sonlandırmak için Control-C'yi kullanabilirsiniz.

0
Shawn