web-dev-qa-db-fra.com

Manière plus rapide que ping pour vérifier si l'ordinateur en ligne?

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ôtes, IPS et Mac, et je suis actuellement ping chacun d'entre eux avec '-C1' afin que cela ne fonctionne pas sans fin - mais même cela prend une attente, y a-t-il un moyen plus rapide d'obtenir Réponse plutôt que ping? L'utilisation de ping semble ralentir le script un peu aussi besoin que les réponses ping puissent continuer.

Merci beaucoup pour toute suggestion!

20
Jon Phenow

Envoi d'un seul paquet et d'attendre une réponse sera l'une des manières possibles les plus rapides et ping est une bonne façon de le faire. En fait, en fonction de votre cas d'utilisation, je dirais que c'est trop rapide, puisqu'il ne vous dit pas vraiment si le système fait tout ce qui est utile, c'est que le sous-système de réseau du noyau est vivant et configuré.

Mais en supposant que cela suffit, vous pouvez apporter des améliorations. Tout d'abord, vous pouvez utiliser -W1 Pour diminuer le délai de ping d'une seconde. Deuxièmement, vous pouvez rendre votre script ping les différents hôtes de manière asynchrone (dans un fil d'arrière-plan) et vérifier les résultats au besoin plutôt que d'attendre.

Alternativement, vous pouvez repenser l'approche et disposer de la vérification des systèmes distants en quelque sorte lorsqu'elles sont en hausse et si un système n'a pas été enregistré, vous pouvez supposer qu'il est en panne.

20
mattdm

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

Vous devez analyser la sortie après plutôt que de compter sur un code de retour, mais c'est beaucoup plus rapide que de faire ping normal.

7

Cela ne fonctionnerait que pour un ou deux ordinateurs, mais si vous les connectez directement à l'ordinateur responsable de la vérification de leur statut, vous pouvez utiliser ethtool pour voir si le lien est actif ou non.

3
LawrenceC

Ce que vous pouviez le faire ping l'adresse de diffusion qui devrait causer de revenir tous les ordinateurs. Ensuite, vous pouvez traverser cette liste par rapport à ce que vous avez dans SQLite pour vous assurer que tous les ordinateurs sont en hausse.

Autre alors qu'un ping est probablement le moyen le plus rapide de s'assurer qu'un ordinateur est éveillé sur un réseau. Comme mentionné par 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 à Ping un serveur central, exécutez une tâche ou tout simplement écho à la liste des processus sur un serveur central qui enregistre la demande. Ensuite, vérifiez simplement que vous vous direz si vous avez des problèmes sans avoir besoin de vérifier manuellement à chaque fois.

2
Josh K

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

2
jsbillings

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 */
0
Joe

J'ai eu le même problème et j'ai proposé le script suivant (rapide et sale). Cela émet des problèmes essentiellement tous en tant que travaux distincts en parallèle et scannera un tout sous-réseau complet en 3 secondes; Notez que pour une raison quelconque, je n'ai pas pris la peine de savoir 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
0
Peer

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

Les -r (réessayer) l'option semble plus rapide que le similaire -c (compter). À l'aide de -r0 résulte en une seule étant envoyée et la sortie est beaucoup abrégée par rapport à d'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 peu de massage pour se débarrasser du ICMP message (s) me donne-moi ...

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

Quant à la vitesse, le fping sur cet ancien noyau Intel de 1,8 GHz avec 4GB 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 le grep et sort semble ajouter seulement 0,001-0.004S au moment ...

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

NOTES

  • Le message ICMP ne se produit pas sur chaque course.
  • le 2>&1 est nécessaire pour empêcher le message ICMP de montrant dans la sortie tel qu'il est envoyé à stderr de stdout.
0
DocSalvager