• [^] # Re: Toutes les secondes ?

    Posté par (site web personnel) . En réponse au message Surveillance de la latence d'une liste d'hôte. Évalué à 5.

    Voila un script vite fait en PHP, il faut le nommer check_address.php (car il s'auto-lance pour chaque mesure) :

    <?php
    // check_address.php
    function latence($host, $port = 7, $timeout = 10) {
     $ts = microtime(true);
     $f = @fsockopen($host, $port, $errno, $errstr, $timeout);
     $result = microtime(true) - $ts;
     if (! $f) {
     $result = $timeout;
     } else {
     fclose($f);
     }
     return round($result * 1000, 0);
    }
    if (! isset($argv[1]) || ! isset($argv[2])) {
     // *******************************************************
     // daemon principal -> lance les pings toutes les secondes
     // *******************************************************
     $list_address = @file_get_contents("./list_address");
     $t_ip = explode("\n", $list_address);
     // nettoyage
     for ($i = 0; $i < count($t_ip); $i++) {
     $t_ip[$i] = trim($t_ip[$i]);
     if ($t_ip[$i] == "") unset($t_ip[$i]);
     }
     $time = time();
     while (true) { // boucle infinie, il faudra killer le process pour terminer le programme
     while ($time == time()) usleep(10);
     $time = time();
     // lancement des mesures
     foreach ($t_ip as $ip) {
     echo date("Y-m-d H:i:s", $time)." : Mesure de $ip\n";
     system("php check_address.php ".escapeshellarg($ip)." $time > /dev/null 2> /dev/null &");
     }
     }
     exit();
    } else {
     // **********************************************************************
     // programme appelé par le daemon principal -> mesure latence de cette IP
     // **********************************************************************
     $ip = trim($argv[1]);
     $time = (int) $argv[2];
     // mesure de la latence de cette IP
     $latence = latence($ip);
     // enregistrement de la mesure dans ./jour/ip
     $jour = date("Y-m-d", $time);
     if (! is_dir("./$jour")) mkdir("./$jour");
     if ($f = @fopen("./$jour/$ip", "a")) {
     fputs($f, date("H:i:s", $time)." ".$latence."ms\n");
     fclose($f);
     }
    }
    ?>

    La latence est mesurée en faisant un fsockopen sur le port 7. On peut aussi facilement faire du vrai ICMP avec socket_connect et consorts si besoin (à voir ta définition de "latence").
    Le timeout est à 1s par defaut, pour éviter d'engorger la machine avec des process forkés qui se termineraient plus lentement qu'ils ne sont lancés, mais tu peux l'augmenter si tu surveilles un peu tout ça en cours d'execution.
    Si tu surveilles beaucoup beaucoup d'IP, faut voir aussi si la machine suit le rythme.