GNU/Linux >> Znalost Linux >  >> Linux

Jak pingnout v linuxu, dokud není znám hostitel?

Řešení 1:

Další zjednodušení Martynasovy odpovědi:

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

všimněte si, že samotný ping se používá jako test smyčky; jakmile se to podaří, smyčka končí. Tělo smyčky je prázdné, obsahuje příkaz null ": " slouží k zamezení syntaktické chyby.

Aktualizace:Přemýšlel jsem o způsobu, jak přimět Control-C opustit smyčku ping čistě. Toto spustí smyčku na pozadí, zachytí signál přerušení (Control-C) a ukončí smyčku na pozadí, pokud k ní dojde:

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"

Je to trochu zdlouhavé, ale pokud chcete, aby byla smyčka zrušitelná, mělo by to stačit.

Řešení 2:

Vím, že otázka je stará... a konkrétně se ptá na ping , ale chtěl jsem se podělit o své řešení.

Používám to při restartování hostitelů, abych věděl, kdy se k nim mohu vrátit pomocí SSH. (Od ping bude reagovat několik sekund před sshd je spuštěno.)

until nc -vzw 2 $host 22; do sleep 2; done

Řešení 3:

Můžete udělat smyčku, poslat jeden ping a v závislosti na stavu přerušit smyčku, například (bash):

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

Umístění tohoto někam do skriptu bude blokovat, dokud www.google.com je možné pingnout.

Řešení 4:

Proveďte jednou ping na cílového hostitele. Zkontrolujte, zda byl ping úspěšný (návratová hodnota pingu je nula). Pokud hostitel není naživu, ping znovu.

Následující kód lze uložit jako soubor a volat s názvem hostitele jako argumentem, nebo lze odstranit první a poslední řádek a použít jako funkci v rámci existujícího skriptu (waitForHost hostname).

Kód nevyhodnocuje příčinu selhání, pokud ping nevede k odpovědi, takže pokud hostitel neexistuje, bude se věčně opakovat. Moje BSD manuálová stránka uvádí význam každé návratové hodnoty, zatímco linuxová ne, takže si myslím, že to nemusí být přenosné, proto jsem to vynechal.

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

Řešení 5:

UNREACHEABLE=1;
while [ $UNREACHEABLE -ne "0" ]; 
   do ping -q -c 1 HOST &> /dev/null; UNREACHEABLE=$?; sleep 1;
done

Můžete odstranit režim spánku 1, je to zde pouze proto, aby se zabránilo jakémukoli problému zahlcení v případě, kdy by byl hostitel dosažitelný, ale ping by neukončil s kódem 0.


Linux
  1. Jak nainstalovat a používat příkaz Ping v Linuxu

  2. Jak smyčkovat adresáře v Linuxu?

  3. Jak mohu povolit Ping na virtuálním počítači Azure Linux

  1. Jak opakovat příkaz, dokud neuspěje v Linuxu

  2. Jak zakázat odpovědi Ping v Linuxu pomocí icmp_echo_ignore_all

  3. Linux:Odešlete příkaz ping všem hostitelům v podsíti

  1. Jak přidat hostitele Linuxu na server Zabbix pro monitorování

  2. Jak používat Linuxový příkaz Ping

  3. QEMU jak pingnout hostitelskou síť?