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 true
comando e quindi chiudendo la connessione. Il ssh
comando 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 mysqld
sia 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 monit
alla 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/raid
sia 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 telnet
raggiunge 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 timeout
e 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