¿Comando / script de Shell para ver si un host está vivo?

9

Estoy tratando de descubrir más formas de ver si un host determinado está activo, solo usando comandos de shell (principalmente bash). Idealmente, podría funcionar con nombres de host y direcciones IP. En este momento, la única forma nativa que conozco es ping, quizás integrado en un script como se describe aquí. ¿Alguna otra idea?

usuario67459
fuente

Respuestas:

7

ping es la forma de probar si un host está vivo y conectado. (Si un host está vivo pero desconectado o es lento para responder, no puede distinguirlo de que está muerto).

Las opciones admitidas por el pingcomando varían de un sistema a otro. Deberá asegurarse de que no se repita para siempre, sino que regrese después de unos segundos si no recibe una respuesta.

Con FreeBSD y Linux iputils, ping -c 1 -W 1 >/dev/nullenvía un solo ping y espera 1 segundo. No es necesario analizar el resultado: el comando devuelve 0 si recibió un ping de regreso y distinto de cero (nombre de host desconocido, sin ruta al host, sin respuesta). Algunas implementaciones pueden necesitar diferentes indicadores (por ejemplo, en -wlugar de -Wen FreeBSD), consulte el manual de su 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
Gilles 'SO- deja de ser malvado'
fuente
Sé que es el camino, solo esperaba que no fuera el único, incluso si las otras formas son extrañas o volubles o lo que sea. ¡Oh bien!
user67459
2
Esta respuesta NO debería haber sido marcada como la answeredrespuesta. El OP solicitó específicamente more ways to see if a given host is up, aparte de con ping, que esta respuesta no proporciona.
Yokai
Desde la página de manual '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 Ese párrafo podría haberse redactado mejor. Es demasiado alarmista. No debe hacer pings de inundación o pings con una frecuencia muy alta, pero un paquete de ping de vez en cuando es insignificante.
Gilles 'SO- deja de ser malvado'
2

Ping es excelente para obtener una respuesta rápida sobre si el host está conectado a la red, pero a menudo no le dirá si el host está vivo o no, o si todavía está funcionando como se esperaba. Esto se debe a que el kernel generalmente maneja las respuestas de ping, por lo que incluso si todas las aplicaciones en el sistema se han bloqueado (por ejemplo, debido a una falla de disco o falta de memoria), a menudo obtendrá respuestas de ping y puede suponer que la máquina está operando normalmente cuando la situación es todo lo contrario.

Servicios de cheques

Por lo general, no le importa si un host todavía está en línea o no, lo que realmente le importa es si la máquina todavía está realizando alguna tarea. Entonces, si puede verificar la tarea directamente, sabrá que el host está activo y que la tarea aún se está ejecutando.

Para un host remoto que ejecuta un servidor web, por ejemplo, puede hacer algo como esto:

# 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

Si ejecuta SSH y tiene claves configuradas para iniciar sesión sin contraseña, entonces tiene algunas opciones más, por ejemplo:

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

Esto funciona mediante SSH'ing en el host y ejecutando el truecomando y luego cerrando la conexión. El sshcomando solo devolverá el éxito si ese comando se puede ejecutar con éxito.

Pruebas remotas a través de SSH

Puede ampliar esto para verificar procesos específicos, como asegurarse de que se mysqldestá ejecutando en la máquina:

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

Por supuesto, en este caso, sería mejor ejecutar algo como moniten el destino para garantizar que el servicio se siga ejecutando, pero es útil en scripts en los que solo desea realizar alguna tarea en la máquina A siempre que la máquina B esté lista para ello. .

Esto podría ser algo así como verificar que la máquina de destino tiene un cierto sistema de archivos montado antes de realizar un trabajo rsyncen él, de modo que no llene accidentalmente su disco principal si un sistema de archivos secundario no se montó por alguna razón. Por ejemplo, esto asegurará que /mnt/raidesté montado en la máquina de destino antes de continuar.

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

Servicios sin cliente

A veces no hay una manera fácil de conectarse al servicio y solo desea ver si acepta las conexiones TCP entrantes, pero cuando va telnetal destino en el puerto en cuestión, simplemente se queda allí y no lo desconecta, lo que significa hacerlo en una secuencia de comandos lo colgaría.

Si bien no es tan limpio, todavía se puede hacer esto con la ayuda de la timeouty netcatprogramas. Por ejemplo, esto verifica si la máquina acepta conexiones SMB / CIFS en el puerto TCP 445, por lo que puede ver si está ejecutando el intercambio de archivos de Windows incluso si no tiene una contraseña para iniciar sesión, o si las herramientas del cliente CIFS no están ' t instalado:

# 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
Malvinoso
fuente