Comando / script Shell per vedere se un host è vivo?


9

Sto cercando di capire altri modi per vedere se un determinato host è attivo, usando solo i comandi di shell (principalmente bash). Idealmente, sarebbe in grado di funzionare con nomi host e indirizzi IP. In questo momento l'unico modo nativo che conosco è il ping, forse integrato in uno script come descritto qui. Altre idee?

Risposte:


7

ping è il modo per verificare se un host è vivo e connesso. (Se un host è vivo ma disconnesso o lento a rispondere, non puoi distinguerlo dal fatto che sia morto.)

Le opzioni supportate dal pingcomando variano da sistema a sistema. Ti consigliamo di assicurarti che non rimanga in loop per sempre ma ritorni dopo pochi secondi se non ha ricevuto una risposta.

Con FreeBSD e Linux iputils, ping -c 1 -W 1 >/dev/nullinvia un singolo ping e attendi 1 secondo. Non è necessario analizzare l'output: il comando restituisce 0 se riceve un ping indietro e diverso da zero (nome host sconosciuto, nessuna route verso l'host, nessuna risposta). Alcune implementazioni potrebbero richiedere flag diversi (ad es. -wAnziché -Wsu FreeBSD), controlla il manuale sul tuo sistema.

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

So che è il modo, speravo solo che non fosse l'unico modo, anche se gli altri modi sono strani o instabili o che cosa hai. Oh bene!
user67459

2
Questa risposta NON avrebbe dovuto essere contrassegnata come answeredrisposta. L'OP ha chiesto espressamente more ways to see if a given host is up, oltre a ping, che questa risposta non fornisce.
Yokai,

Dalla pagina man "ping":"Because of the load it can impose on the network, it is unwise to use ping during normal operations or from automated scripts."
1111161171159459134,

@ 1111161171159459134 Quel paragrafo avrebbe potuto essere formulato meglio. È eccessivamente allarmista. Non dovresti fare ping di ping o ping con un tasso molto alto, ma un pacchetto di ping di tanto in tanto è trascurabile.
Gilles 'SO- smetti di essere malvagio' il

2

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.