92 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

69voto

Victor Bjelkholm Points 705

Pour les personnes qui recherchent une solution qui implique ping utilisez le -i interrupteur.

ping -i 0.2 www.google.com

Ou, si vous voulez utiliser la version 0.1, vous devez l'exécuter en tant que root.

sudo ping -i 0.1 www.google.com

Il n'est pas nécessaire de télécharger des utilitaires supplémentaires.

6 votes

+1 de ma part. C'est le premier résultat quand on cherche "ping timeout" sur Google, et c'est exactement ce que je cherchais.

0 votes

@StevenJeffries Même chose ici !

0 votes

Si vous avez une version plus récente de timeout vous pouvez faire timeout 0.1 ping -c 1 ${hostname} . Les anciennes versions de timeout ne prennent en charge que les valeurs entières positives du délai d'attente.

65voto

AndyN Points 1699

fping pourrait être un meilleur outil que le stock de ping que vous utilisez. Quel est votre système d'exploitation ?

  • "fping diffère de ping en ce que vous pouvez spécifier un nombre quelconque de cibles sur la ligne de commande, ou spécifier un fichier contenant les listes de cibles à ping."
  • "Au lieu d'envoyer à une cible jusqu'à ce qu'elle dépasse son temps de réponse ou réponde, fping enverra un paquet ping et passera à la cible suivante de manière circulaire."
  • "Contrairement à ping, fping est destiné à être utilisé dans scripts, donc sa sortie est conçue pour être facile à analyser."

Exemple :

fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4
  • -c Nombre de paquets de demande à envoyer à chaque cible.
  • -t Délai initial de la cible en millisecondes

1 votes

Cela fonctionne très bien, merci, c'est ce que je cherchais. Cette commande fait très bien l'affaire : fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 ... Le tout dure une demi-seconde, et j'obtiens les résultats pour tous les hôtes en même temps. Excellent outil :-))

37voto

Jordon Bedwell Points 400

Vous pouvez définir un court délai d'attente avec l'option timeout sur Ubuntu/Debian :

timeout 0.2 ping -c1 fqdn || { do_work }

0 votes

Bonne réponse ! J'ai maintenant fait : timeout 1 ping -c 1 test.com

1 votes

Ma version de timeout n'accepte que 1 seconde. timeout (GNU coreutils) 8.4 .

0 votes

J'aime cette solution, elle peut être appliquée à toutes les autres commandes

18voto

pacey Points 3783

J'utiliserais nmap pour cette tâche.

nmap -sP --max-retries=1 --host-timeout=1500ms 10.0.0.1

Ver el nmap Documentation pour plus de détails à ce sujet.

0 votes

Bon appel C'est la façon "géniale" de le faire :D +1

0 votes

Bonjour, je viens d'essayer, mais j'ai obtenu le message d'erreur suivant : "--host-timeout est spécifié en millisecondes, sauf si vous le qualifiez en ajoutant 's', 'm', 'h' ou 'd'. La valeur doit être supérieure à 1500 millisecondes".

0 votes

Je pense que le problème est évident, le timeout ne peut pas être inférieur à 1500ms. Vous devriez alors chercher les options de nmap concernant le parallélisme, je pense.

15voto

NXT Points 193

Utilice -w sur Windows et sur Debian.

C'est un moyen rapide de vérifier si la machine répond, en supposant qu'elle répondra dans un délai inférieur au nombre de secondes spécifié.

ping -w 1 192.168.80.105

PING 192.168.80.105 (192.168.80.105) 56(84) bytes of data.

--- 192.168.80.105 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 999ms

0 votes

Pour ubuntu c'est -W (w majuscule) -w <deadline> reply wait <deadline> in seconds Et -W <timeout> time to wait for response

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