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 true
comando y luego cerrando la conexión. El ssh
comando 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 mysqld
está 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 monit
en 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 rsync
en é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/raid
esté 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 telnet
al 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 timeout
y netcat
programas. 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