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 true
polecenia, a następnie zamknięcie połączenia. ssh
Komenda 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 mysqld
dział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 monit
na 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 rsync
do 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/raid
przed 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 telnet
do 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 timeout
i 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