93 votes

Comment puis-je définir un court délai d'attente avec la commande ping ?

J'essaie d'écrire un script qui liste tous les hôtes de mon réseau local (il y en a une vingtaine) et écrit le statut ping à côté de chaque hôte. J'ai le fichier des baux DHCP, donc j'ai toutes les IPs (disons, 10.0.0.1, 10.0.0.2, etc.), tout ce dont j'ai besoin est le statut ping pour chaque hôte.

Ainsi, mon script lance un seul ping pour chaque hôte :

ping -c 1 10.0.0.1

Malheureusement, lorsqu'un hôte est hors ligne, le ping prend beaucoup de temps avant de s'arrêter. J'ai vérifié man ping il semble y avoir deux options pour définir le délai d'attente : -w deadline y -W timeout . Je pense que je suis intéressé par ce dernier.

Alors j'ai essayé ça :

ping -c 1 -W 1 10.0.0.1

Mais attendre une seconde par hôte hors ligne est encore trop long. J'ai essayé de le régler en dessous d'une seconde, mais il ne semble pas du tout prendre en compte le paramètre :

ping -c 1 -W 0.1 10.0.0.1  # timeout option is ignored, apparently

Y a-t-il un moyen de régler le délai d'attente à une valeur inférieure ? Sinon, existe-t-il des alternatives ?

Modifier

  • L'O.S. est Debian Lenny.
  • Les hôtes que j'essaie de pinguer sont en fait des points d'accès. Ils sont sur le même vlan et le même sous-réseau que les utilisateurs (pour simplifier le déploiement et le remplacement). C'est pourquoi je ne souhaite pas scanner tout le sous-réseau (avec un ping -b par exemple).

Edit #2

J'ai accepté le fping (merci pour toutes les autres réponses). Cette commande fait exactement ce que je cherchais :

fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4

Cette commande prend au maximum 500 ms et me donne le statut ping de tous les hôtes en même temps :

10.0.0.1 : [0], 84 bytes, 5.71 ms (5.71 avg, 0% loss)
10.0.0.2 : [0], 84 bytes, 7.95 ms (7.95 avg, 0% loss)
10.0.0.3 : [0], 84 bytes, 16.1 ms (16.1 avg, 0% loss)
10.0.0.4 : [0], 84 bytes, 48.0 ms (48.0 avg, 0% loss)

10.0.0.1 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 5.71/5.71/5.71
10.0.0.2 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 7.95/7.95/7.95
10.0.0.3 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 16.1/16.1/16.1
10.0.0.4 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 48.0/48.0/48.0

Sur Debian Lenny, l'installation est triviale :

aptitude update
aptitude install fping

5voto

Kirill Osenkov Points 3902

Si tous vos hôtes se trouvent sur le réseau local physique, vous pouvez utiliser l'outil arp ping, qui fait la même chose mais utilise des paquets arp de couche 2 pour effectuer le "ping". Vous pouvez utiliser une combinaison de arp et icmp ping, ou en fait tcp ping, pour déterminer la cause de la panne. Par exemple, un plantage de la pile tcp, bien que rare de nos jours, nous pourrions trouver si la pile tcp d'une machine s'est plantée, car la machine ne répondrait pas à ping, mais elle répondrait à arp (qui est un morceau de code différent sur l'hôte).

en utilisant une combinaison de arpping, tcpping, et icmp ping vous pouvez découvrir si le service sur la machine a planté, la pile tcp a planté, ou la machine s'est complètement bloquée. Si vous avez des commutateurs Ethernet gérés, vous pouvez obtenir des données de liaison physique, révélant si la machine est réellement allumée ou si elle a été physiquement débranchée. Nous avons eu une situation où des machines (des clients dans des salles publiques) étaient éteintes, nous avons recueilli ces données et envoyé des paquets de réveil en lan, pour rallumer les machines. :-)

Quelles que soient les solutions que vous mettez en place, si votre réseau est occupé, pensez à implémenter une sorte de qos, afin que vos paquets de surveillance soient prioritaires sur le réseau, la perte de paquets de mesure due à la congestion du réseau peut donner de fausses alarmes. Si vous utilisez la qualité de service pour les paquets de surveillance, vous devrez alors penser à collecter des données sur l'utilisation du réseau.

Ainsi, vous pouvez rendre votre solution de surveillance aussi complexe ou aussi simple que vous le souhaitez. Nous trouvons que même le système de surveillance le plus élémentaire est un pas dans la bonne direction, au moins un administrateur garde un œil sur les machines :-).

Bonne chance !

5voto

Digc Points 31

@jordon-bedwell a une super suggestion.

@laszlo-valko https://stackoverflow.com/questions/20359487/why-does-ping-not-timeout-in-linux explique que les délais de ping ne commencent qu'après la détermination de l'adresse IP. Si vous utilisez un dns et que votre station de travail est hors ligne, ping ne peut pas déterminer l'adresse IP et semble donc attendre environ 20+secs par défaut avant de renvoyer un faux.

L'utilisation de l'outil linux 'timeout' permet de mieux contrôler l'exécution de ping avec un nom de domaine.

Merci les gars

1 votes

Merci d'ajouter DNS à la discussion sur cette question bien classée. Si quelqu'un a des suggestions sur la façon d'accomplir la même chose timeout sur macOS (et Windows je suppose), cela compléterait les outils de scripting ping.

2voto

motobói Points 1501

Sous macOS, pour définir le temps que ping attend pour une réponse du serveur avant de décider qu'il s'agit d'une non-réponse (délai d'attente), il suffit de -t :

ping -t 1 -c 1 host

0 votes

Notez qu'il s'agit du temps d'attente total du ping, si vous utilisez un nombre plus élevé de pings -- pour définir le temps d'attente pour chaque ping individuel, utilisez -W comme sur Gnu/Linux, sauf que sur MacOS les unités de temps sont des millisecondes

1voto

kajaco Points 1289

Si vous pouvez scanner votre sous-réseau (ou une partie de celui-ci) sans déclencher d'alarmes de sécurité, et si vous n'êtes pas contre un peu de données supplémentaires, Scanner IP en colère est rapide, gratuit, vous permet de cliquer pour trier par statut, et peut fournir des informations plus détaillées.

0voto

dfranke Points 379

Pourquoi ne pas lancer ping en arrière-plan, avec sortie dans un fichier temporaire, en parallèle pour chaque hôte ? Ensuite, il suffit de dormir pendant une seconde, de tuer tous les processus ping qui sont encore en cours d'exécution, et de lire les fichiers pour recueillir les résultats.

1 votes

Je suppose que ça pourrait fonctionner, mais je cherchais une solution plus simple. Merci quand même.

0 votes

Cette méthode n'est pas évolutive.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X