Il ping è ottimo per ottenere una risposta rapida sul fatto che l'host sia connesso alla rete, ma spesso non ti dirà se l'host è vivo o meno o se funziona ancora come previsto. Questo perché le risposte ping sono generalmente gestite dal kernel, quindi anche se tutte le applicazioni sul sistema si sono arrestate in modo anomalo (ad esempio a causa di un errore del disco o della memoria insufficiente), si ottengono spesso risposte ping e si può presumere che la macchina sia funziona normalmente quando la situazione è esattamente l'opposto.
Verifica dei servizi
Di solito non ti interessa davvero se un host è ancora online o meno, ciò che ti interessa davvero è se la macchina sta ancora eseguendo qualche attività. Quindi, se puoi controllare l'attività direttamente, saprai che l'host è attivo e che l'attività è ancora in esecuzione.
Per un host remoto che esegue un server Web, ad esempio, puoi fare qualcosa del genere:
# 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
Se esegue SSH e hai le chiavi configurate per l'accesso senza password, allora hai alcune altre opzioni, ad esempio:
if ssh "$TARGET" true; then
echo "$TARGET alive and accessible via SSH"
else
echo "$TARGET offline or not accepting SSH logins"
fi
Questo funziona tramite SSH nell'host ed eseguendo il truecomando e quindi chiudendo la connessione. Il sshcomando restituirà esito positivo solo se quel comando potrebbe essere eseguito correttamente.
Test remoti tramite SSH
È possibile estenderlo per verificare processi specifici, ad esempio assicurarsi che mysqldsia in esecuzione sulla macchina:
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
Ovviamente in questo caso sarebbe meglio eseguire qualcosa di simile monitalla destinazione per assicurarsi che il servizio continui a funzionare, ma è utile negli script in cui si desidera eseguire solo alcune attività sulla macchina A finché la macchina B è pronta per questo .
Questo potrebbe essere qualcosa come verificare che la macchina target abbia un certo filesystem montato prima di eseguirlo rsync, in modo da non riempire accidentalmente il suo disco principale se un filesystem secondario non si monta per qualche motivo. Ad esempio, questo assicurerà che /mnt/raidsia montato sul computer di destinazione prima di continuare.
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
Servizi senza client
A volte non esiste un modo semplice per connettersi al servizio e si desidera solo vedere se accetta connessioni TCP in entrata, ma quando si telnetraggiunge la destinazione sulla porta in questione, si trova lì e non si disconnette, il che significa farlo in uno script lo farebbe bloccare.
Sebbene non sia così pulito, puoi comunque farlo con l'aiuto dei programmi timeoute netcat. Ad esempio, questo controlla se la macchina accetta connessioni SMB / CIFS sulla porta TCP 445, quindi puoi vedere se sta eseguendo la condivisione di file Windows anche se non hai una password per accedere, o gli strumenti client CIFS non sono ' t installato:
# 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