Un moyen plus rapide que le ping pour vérifier si l'ordinateur est en ligne?

20

J'écris un sillage sur le script LAN pour un ensemble de nos ordinateurs de laboratoire. Nous avons sqlite db avec une liste des noms d'hôte, IP et MAC de l'ordinateur et actuellement je ping chacun d'eux avec '-c1' pour qu'il ne fonctionne pas sans fin - mais même cela prend un peu d'attente, existe-t-il un moyen plus rapide d'obtenir répondre plutôt que cingler? L'utilisation de ping semble ralentir un peu le script car il a besoin des réponses de ping pour continuer.

Merci beaucoup pour toutes suggestions!

Jon Phenow
la source

Réponses:

20

L'envoi d'un seul paquet et l'attente d'une réponse seront l'un des moyens les plus rapides possibles, et le ping est une excellente façon de le faire. En fait, selon votre cas d'utilisation, je dirais que c'est trop rapide , car il ne vous dit pas vraiment si le système fait réellement quelque chose d'utile, juste que le sous-système réseau du noyau est vivant et configuré.

Mais en supposant que cela soit suffisant, vous pouvez apporter quelques améliorations. Tout d'abord, vous pouvez utiliser -W1pour réduire le délai d'expiration du ping à une seconde. Deuxièmement, vous pouvez faire en sorte que votre script envoie une requête ping aux différents hôtes de manière asynchrone (dans un thread d'arrière-plan) et vérifiez les résultats selon vos besoins plutôt que d'attendre.

Alternativement, vous pouvez repenser l'approche et demander aux systèmes distants de s'enregistrer d'une manière ou d'une autre lorsqu'ils sont en place, et si un système ne s'est pas enregistré, vous pouvez supposer qu'il est en panne.

mattdm
la source
Bon appel à l'ajout -w, a dû en faire deux, car un tas d'ordinateurs n'ont pas répondu assez rapidement. Pourrait envisager d'ajouter une sorte d'enregistrement périodique ou de serrer la main, mais pour l'instant, je veux que le processus soit relativement externe aux ordinateurs que j'allume.
Jon Phenow
1
J'utilise également -s pour envoyer un petit paquet.
Shawn J. Goff
3
Je serai choqué si l'envoi d'un petit paquet fait une différence.
mattdm
Ne sont-ils pas à peu près déjà envoyés à une taille presque minimale de paquets?
Jon Phenow
4
Ils sont assez petits; il y a une valeur par défaut de 56 octets de données, que vous pouvez réduire. Mais dans tous les cas, il est plus petit que le MTU Ethernet et plus grand que rien, donc cela revient à "un paquet" de toute façon.
mattdm
7

C'est pour cela que fping a été conçu. http://fping.sourceforge.net/

Vous devez analyser la sortie par la suite au lieu de vous fier à un code retour, mais c'est beaucoup plus rapide que de faire un ping normal.

Thorbjørn Ravn Andersen
la source
Je pense que c'est un peu drôle la description dit "Contrairement à ping, fping est destiné à être utilisé dans les scripts et sa sortie est facile à analyser." et pourtant il ne fournit pas de code de retour
Adam Plocher
Quelles seraient les bonnes valeurs pour le code retour?
Thorbjørn Ravn Andersen
3

Cela ne fonctionnerait que pour un ou deux ordinateurs, mais si vous les connectez directement à l'ordinateur chargé de vérifier leur état, vous pouvez utiliser ethtoolpour voir si le lien est actif ou non.

LawrenceC
la source
Je n'ai pas utilisé ethtool pour cela, voulez-vous donner un exemple? (ou peut-être un lien)?
Johan
ethtool {network_interface} | grep "Link detected" | cut -f 3 -d ' 'reviendra yessi une machine est connectée, et nosi ce n'est pas le cas.
LawrenceC
2

Qu'est-ce que vous pourriez faire? Envoyez une requête ping à l'adresse de diffusion, ce qui devrait entraîner le ping de tous les ordinateurs. Ensuite, vous pouvez vérifier cette liste par rapport à ce que vous avez dans SQLite pour vous assurer que tous les ordinateurs sont en marche.

À part cela, un ping est probablement le moyen le plus rapide de s'assurer qu'un ordinateur est réveillé sur un réseau. Comme mentionné dans l'autre réponse, cela ne fournit aucune donnée vraiment utile. Si vous avez la possibilité d'installer des scripts, vous pouvez ajouter un cronjob pour envoyer une requête ping à un serveur central, exécuter une tâche ou simplement renvoyer la liste des processus à un serveur central qui enregistrera la demande. Ensuite, il suffit de vérifier cela pour savoir si vous avez des problèmes sans avoir besoin de vérifier manuellement à chaque fois.

Josh K
la source
1
Je suppose que vous voulez cingler l'adresse de diffusion, pas la passerelle. Sur les systèmes modernes, cela ne fonctionnera probablement pas. Voir unix.stackexchange.com/questions/7458/cant-ping-broadcast
mattdm
1
@mattdm: multidiffusion alors? Je ne savais pas que la plupart des gens l'étaient. Je n'ai jamais rencontré de problèmes avec.
Josh K
Haha oui merci mattdm, un problème similaire que vous pouvez voir que j'ai rencontré. ce n'est pas que les gens les éteignent, mais ils viennent généralement avec une diffusion ces derniers temps apparemment.
Jon Phenow
Pourrait utiliser fping ( fping.sourceforge.net ) pour envoyer une requête ping à une liste d'hôtes en parallèle. Ensuite, vous ne devez pas compter sur la possibilité d'envoyer une requête ping à l'adresse de diffusion.
mazianni
2

Ganglia utilise le trafic de multidiffusion pour surveiller de nombreux hôtes dans un cluster, peut-être pourriez-vous utiliser quelque chose de similaire? Cela suppose que votre matériel réseau autorise le trafic de multidiffusion entre tous les hôtes et votre système de surveillance.

jsbillings
la source
1
Cela ressemble à un outil sympa, mais pour les besoins de ce petit script, il pourrait ajouter des morceaux inutiles au projet, en le conservant comme un assez petit script pour l'instant. Gardera certainement mon œil dessus, ressemble à un outil que je pourrais bientôt utiliser.
Jon Phenow
0

J'ai eu le même problème et j'ai trouvé le script suivant (rapide et sale). Cela émet essentiellement tous les pings en tant que travaux séparés en parallèle et analysera un sous-réseau entier / 24 en 3 secondes; notez que pour une raison quelconque, je n'ai pas pris la peine de découvrir que je ne pouvais pas utiliser le code de résultat ping ici, mais grep -v a fait le travail:

#!/bin/bash
case $# in
1)
  case $1 in
  [1-9]*)
        echo
        echo Systems active in subnet: $1
        for (( K = 1 ; K < 255 ; K=$K+1 )); do
        # grep -v delivers 0 on no matches
                echo -ne "testing:" $1$K "...    \r"
                (if ping -c 1 -w 1 -n $1$K 2>&1 | grep -q '64 bytes' ; then
                echo $1$K alive "                "
                fi) &
        done
        sleep 3
        echo "                               "
        exit 0
        ;;
  esac;;
esac
Pair
la source
0

En C,

/* count = 1, wait interval = 1 second, no name lookup, */
/* 10 data bytes, 1 second timeout, 200 millisecond wait time */

sprintf(command,"ping -c1 -i1 -n -s10 -t1 -W200 %u" 
   , connection[port].IPAddress);
err = system(command);
/* err == 0 means OK */
Joe
la source
0

J'ai trouvé fping -r0 ...pour fournir la réponse la plus rapide.

L' -roption (réessayer) semble plus rapide que la similaire -c(count). L'utilisation de -r0résultats entraîne l'envoi d'un seul ping et la sortie est bien abrégée par rapport aux autres options.

Sur mon système ...

fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01  2>&1

Résulte en...

LX00 is alive
LX02 is alive
HA01 is alive
ICMP Host Unreachable from 192.168.1.5 for ICMP Echo sent to LX01
PRINTER is unreachable
LX01 is unreachable
LX03 is unreachable

Un petit massage pour me débarrasser du ICMP(des) message (s) me donne ...

fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01  2>&1 | grep ' is ' | sort

HA01 is alive
LX00 is alive
LX01 is unreachable
LX02 is alive
LX03 is unreachable
PRINTER is unreachable

En ce qui concerne la vitesse, le fpingsur ce vieux Intel Dual-Core 1,8 GHz avec 4 Go de RAM est ...

time fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01 2>&1

LX00 is alive
LX02 is alive
HA01 is alive
PRINTER is unreachable
LX01 is unreachable
LX03 is unreachable

real    0m0.554s
user    0m0.000s
sys     0m0.000s

Et les grepet ne sortsemblent ajouter que 0,001-0,004 au temps ...

time fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01 2>&1 | grep ' is ' | sort

HA01 is alive
LX00 is alive
LX01 is unreachable
LX02 is alive
LX03 is unreachable
PRINTER is unreachable

real    0m0.558s
user    0m0.000s
sys     0m0.000s

REMARQUES

  • Le ICMPmessage ne se produit pas à chaque exécution.
  • Il 2>&1est nécessaire d'empêcher le ICMPmessage de s'afficher dans la sortie lorsqu'il est envoyé à la stderrplace de stdout.
DocSalvager
la source