Polecenie / skrypt powłoki, aby sprawdzić, czy host żyje?

9

Próbuję znaleźć więcej sposobów, aby sprawdzić, czy dany host działa, używając wyłącznie poleceń powłoki (głównie bash). Idealnie byłoby w stanie pracować zarówno z nazwami hostów, jak i adresami IP. W tej chwili jedynym znanym mi rodzimym sposobem jest ping, być może zintegrowany ze skryptem, jak opisano tutaj. Jakieś inne pomysły?

użytkownik67459
źródło

Odpowiedzi:

7

ping to sposób na sprawdzenie, czy host żyje i jest podłączony. (Jeśli host żyje, ale jest rozłączony lub reaguje wolno, nie można odróżnić tego od martwego).

Opcje obsługiwane przez to pingpolecenie różnią się w zależności od systemu. Będziesz chciał upewnić się, że nie zapętla się wiecznie, ale powraca po kilku sekundach, jeśli nie otrzyma odpowiedzi.

W przypadku FreeBSD i Linux iputils ping -c 1 -W 1 >/dev/nullwysyła pojedynczy ping i odczekuje 1 sekundę. Nie trzeba analizować danych wyjściowych: komenda zwraca 0, jeśli otrzymała polecenie ping, a w przeciwnym razie niezerowe (nieznana nazwa hosta, brak trasy do hosta, brak odpowiedzi). Niektóre implementacje mogą wymagać różnych flag (np. -wZamiast -Ww FreeBSD), sprawdź instrukcję w systemie.

if ping -c 1 -W 1 "$hostname_or_ip_address"; then
  echo "$hostname_or_ip_address is alive"
else
  echo "$hostname_or_ip_address is pining for the fjords"
fi
Gilles „SO- przestań być zły”
źródło
Wiem, że tak jest, miałem tylko nadzieję, że nie był to jedyny sposób, nawet jeśli inne sposoby są dziwne lub kapryśne, albo co masz. No cóż!
user67459,
2
Ta odpowiedź NIE powinna być oznaczona jako answeredodpowiedź. OP specjalnie poprosił more ways to see if a given host is up, oprócz tego ping, czego ta odpowiedź nie zawiera.
Yokai
Ze strony "Because of the load it can impose on the network, it is unwise to use ping during normal operations or from automated scripts."
podręcznika użytkownika
@ 1111161171159459134 Ten akapit mógł zostać sformułowany lepiej. To zbyt alarmujące. Nie powinieneś wykonywać pingów powodziowych ani pingów z bardzo wysoką częstotliwością, ale od czasu do czasu jeden pakiet ping jest znikomy.
Gilles „SO- przestań być zły”
2

Ping jest świetny, aby uzyskać szybką odpowiedź na temat tego, czy host jest podłączony do sieci, ale często nie powie ci, czy host żyje, czy nie, lub czy nadal działa zgodnie z oczekiwaniami. Wynika to z faktu, że odpowiedzi ping są zwykle obsługiwane przez jądro, więc nawet jeśli każda aplikacja w systemie uległa awarii (np. Z powodu awarii dysku lub braku pamięci), często nadal otrzymujesz odpowiedzi ping i możesz założyć, że komputer jest działa normalnie, gdy sytuacja jest wręcz przeciwna.

Sprawdzanie usług

Zazwyczaj tak naprawdę nie obchodzi Cię, czy host jest nadal online, ale naprawdę zależy Ci na tym, czy komputer nadal wykonuje jakieś zadanie. Jeśli więc możesz bezpośrednio sprawdzić zadanie, będziesz wiedział, że host działa i że zadanie nadal działa.

Na przykład na zdalnym hoście, na którym działa serwer WWW, możesz zrobić coś takiego:

# Add the -f option to curl if server errors like HTTP 404 should fail too
if curl -I "http://$TARGET"; then
  echo "$TARGET alive and web site is up"
else
  echo "$TARGET offline or web server problem"
fi

Jeśli działa SSH i masz skonfigurowane klucze do logowania bez hasła, masz kilka dodatkowych opcji, na przykład:

if ssh "$TARGET" true; then
  echo "$TARGET alive and accessible via SSH"
else
  echo "$TARGET offline or not accepting SSH logins"
fi

Działa to przez SSH'ing do hosta i uruchomienie truepolecenia, a następnie zamknięcie połączenia. sshKomenda zwróci jedynie sukces jeśli komenda może być prowadzony z powodzeniem.

Zdalne testy przez SSH

Możesz to rozszerzyć, aby sprawdzić określone procesy, takie jak upewnienie się, że mysqlddziała na komputerze:

if ssh "$TARGET" bash -c 'ps aux | grep -q mysqld'; then
  echo "$TARGET alive and running MySQL"
else
  echo "$TARGET offline or MySQL crashed"
fi

Oczywiście w takim przypadku lepiej byłoby uruchomić coś takiego monitna obiekcie docelowym, aby zapewnić nieprzerwane działanie usługi, ale jest to przydatne w skryptach, w których chcesz wykonać tylko jakieś zadanie na komputerze A, o ile komputer B jest na to gotowy .

Może to być coś w rodzaju sprawdzenia, czy na komputerze docelowym jest podłączony określony system plików przed wykonaniem rsyncdo niego, aby nie przypadkowo zapełnić jego główny dysk, jeśli z jakiegoś powodu nie zainstalowano dodatkowego systemu plików. Na przykład upewni się, że /mnt/raidprzed kontynuowaniem zostanie zamontowany na komputerze docelowym.

if ssh "$TARGET" bash -c 'mount | grep -q /mnt/raid'; then
  echo "$TARGET alive and filesystem ready to receive data"
else
  echo "$TARGET offline or filesystem not mounted"
fi

Usługi bez klienta

Czasami nie ma łatwego sposobu na połączenie się z usługą i po prostu chcesz sprawdzić, czy akceptuje ona przychodzące połączenia TCP, ale kiedy przejdziesz telnetdo celu na danym porcie, po prostu tam siedzi i nie rozłącza się, co oznacza robienie tego w skrypcie spowoduje zawieszenie się.

Choć nie jest tak czysty, nadal możesz to zrobić za pomocą programów timeouti netcat. Na przykład sprawdza, czy urządzenie akceptuje połączenia SMB / CIFS na porcie TCP 445, dzięki czemu można sprawdzić, czy działa udostępnianie plików systemu Windows, nawet jeśli nie masz hasła do zalogowania lub narzędzia klienta CIFS nie są Zainstalowano:

# Wait 1 second to connect (-w 1) and if the total time (DNS lookups + connect
# time) reaches 5 seconds, assume the connection was successful and the remote
# host is waiting for us to send data.  Connecting on TCP port 445.
if echo 'x' | timeout --preserve-status 5 nc -w 1 "$TARGET" 445; then
  echo "$TARGET alive and CIFS service available"
else
  echo "$TARGET offline or CIFS unavailable"
fi
Malvineous
źródło