J'essaie de comprendre plus de moyens de voir si un hôte donné est en place, à l'aide de commandes shell (principalement bash). Idéalement, il serait capable de travailler avec des noms d'hôtes et des adresses IP. À l'heure actuelle, la seule façon native que je connaisse est ping, peut-être intégrée à un script comme décrit ici. Toutes autres idées?
ping
-est le moyen de tester si un hôte est vivant et connecté. (Si un hôte est vivant mais déconnecté ou lent pour répondre, vous ne pouvez pas distinguer que de son être mort.)
Les options prises en charge par la commande ping
varient du système au système. Vous voudrez vous assurer qu'il ne boucle pas pour toujours, mais retourne après quelques secondes s'il n'a pas reçu de réponse.
Avec FreeBSD et Linux ItPlutils, ping -c 1 -W 1 >/dev/null
envoie un seul ping et attendez 1 seconde. Vous n'avez pas besoin d'analyser la sortie: la commande renvoie 0 s'il a reçu un dos ping et non zéro sinon (nom d'hôte inconnu, aucun itinéraire d'hôte, pas de réponse). Certaines implémentations peuvent avoir besoin de drapeaux différents (par ex. -w
à la place de -W
sur FreeBSD), vérifiez le manuel de votre système.
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
Ping est idéal pour obtenir une réponse rapide sur le point de savoir si l'hôte est connecté au réseau, mais cela ne vous dira souvent pas si l'hôte est vivant ou non, ou si cela fonctionne toujours comme prévu. En effet, les réponses ping sont généralement gérées par le noyau, de sorte que même si chaque application du système s'est écrasée (par exemple, en raison d'une défaillance de disque ou de la mémoire de mémoire), vous obtenez souvent des réponses ping et peut supposer que la machine est opérant normalement lorsque la situation est tout à fait opposée.
Habituellement, vous ne vous souciez pas vraiment de savoir si un hôte est toujours en ligne ou non, ce que vous vous souciez vraiment de savoir si la machine effectue toujours une tâche. Donc, si vous pouvez vérifier directement la tâche, vous saurez que l'hôte est à la fois sur lequel la tâche est toujours en cours d'exécution.
Pour un hôte distant qui exécute un serveur Web par exemple, vous pouvez faire quelque chose comme ceci:
# 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 elle exécute SSH et que vous avez des clés configurées pour la connexion sans mot de passe, vous avez quelques options supplémentaires, par exemple:
if ssh "$TARGET" true; then
echo "$TARGET alive and accessible via SSH"
else
echo "$TARGET offline or not accepting SSH logins"
fi
Cela fonctionne de Ssh'ing dans l'hôte et exécutant la commande true
puis fermez la connexion. La commande ssh
ne reviendra que le succès si cette commande pourrait être exécutée avec succès.
Vous pouvez étendre ceci pour rechercher des processus spécifiques, tels que vous assurer que mysqld
est en cours d'exécution sur la machine:
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
Bien sûr, dans ce cas, vous feriez mieux de courir quelque chose comme monit
sur la cible pour vous assurer que le service est maintenu en cours d'exécution, mais il est utile dans les scripts où vous voulez seulement effectuer une tâche sur la machine A aussi longtemps que la machine B est prête pour cela.
Cela pourrait être quelque chose comme vérifier que la machine cible a un certain système de fichiers monté avant d'effectuer un rsync
dessus, de sorte que vous remplissez accidentellement son disque principal si un système de fichiers secondaire n'a pas monté pour une raison quelconque. . Par exemple, cela s'assurera que /mnt/raid
Est monté sur la machine cible avant de continuer.
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
Parfois, il n'existe pas de moyen simple de se connecter au service et que vous souhaitez simplement voir s'il accepte des connexions entrantes TCP, mais lorsque vous telnet
à la cible du port en question, il suffit de rester là-bas et ne vous déconnecte pas, ce qui signifie faire que dans un script provoqueraient pendre.
Bien que pas aussi propre, vous pouvez toujours le faire avec l'aide des programmes timeout
et netcat
. Par exemple, ces vérifications pour voir si la machine accepte les connexions SMB/CIFS sur le port TCP 445, vous pouvez donc voir s'il exécute le partage de fichiers Windows, même si vous n'avez pas de mot de passe pour vous connecter ou la CIFS. outils clients ne sont pas installés:
# 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