Мониторинг ноды Ironfish

Cash

Administrator
Команда форума

Приведенный пример сделан на коленке на скорую руку лично для себя, выкладываю потому что много спрашивают.​

Для запуска мониторинга ноды понадобятся исполняемые файлы запуска / перезагрузки ноды / майнера
  • checker.sh - Проверить статус ноды
    Код:
    #!/usr/bin/sh
    . "$HOME/.bashrc"
    . "$HOME/.bash_profile"
    ironfish status
  • restart_node.sh - Рестарт ноды
    Код:
    #!/usr/bin/sh
    . "$HOME/.bashrc"
    . "$HOME/.bash_profile"
    /sbin/service ironfishd restart
  • run_mi.sh - Запустить майнер
    Код:
    #!/usr/bin/sh
    . "$HOME/.bashrc"
    . "$HOME/.bash_profile"
    /sbin/service ironfishd-miner start
  • stop_node.sh - Остановить ноду
    Код:
    #!/usr/bin/sh
    . "$HOME/.bashrc"
    . "$HOME/.bash_profile"
    /sbin/service ironfishd stop
  • start_node.sh - Запустить ноду
    Код:
    #!/usr/bin/sh. "$HOME/.bashrc";
    . "$HOME/.bash_profile"
    /sbin/service ironfishd start

    Каждый файл нужно создать с таким именем как здесь приведено, и сделать его исполняемым.

    В терминале :

    Код:
    chmod +x checker.sh
    chmod +x restart_node.sh
    chmod +x run_mi.sh
    chmod +x stop_node.sh
    chmod +x start_node.sh
Текстовый файл was_blocks.txt для хранения информации о смайненных ранее блоках. ( при запуске записываем в него 0, либо то количество блоков которое отображается в текущий момент при запросе статуса ноды ). ( Этот файл нужно создать ).
  • Управляющий скрипт 1.php

    Код:
    <?php
    ini_set('max_execution_time', '10');
    $time_start = microtime(true); // Запоминаем время старта скрипта
    $pid=getmypid(); // Получаем id процесса скрипта
    file_put_contents('pid.txt',$pid); // Записываем когда скрипт начал работать
    
    $output = shell_exec('./checker.sh'); // Выполняем запуск проверски статуса ноды
    
    file_put_contents('status.txt', $output); // Cохраняем в файл
    
    $blockchain = shell_exec("awk '/Blockchain/ {print}' status.txt"); // Считываем из файла - строку с Blockchain
    
    if (strlen($blockchain) < 5) // Если данных нет - нужно сделать рестарт ноды и майнера
    {
    
        shell_exec('./restart_node.sh'); // Запускаем рестарт ноды
        shell_exec('./run_mi.sh'); // Запускаем майнер
        file_get_contents("https://api.telegram.org/bot1234567891:ASDFcsdfsfdMofSffddssfRRggfgfgddfFDFDw/sendMessage?chat_id=123456789&text=NODE 1 RESTARTED"); // Сообщаем себе о случившемся перезапуске
    }
    
    $node = shell_exec("awk '/Node/ {print}' status.txt"); // Cчитываем статус Ноды
    
    if(strpos($node, 'STARTED') !== false) // Если статус не рабочий
    {
        $node_status=1; // Фиксируем это состояние с помощью флага
    }
    
    $network = shell_exec("awk '/P2P/ {print}' status.txt"); // Считываем статус Сети
    
    if(strpos($network, 'CONNECTED') !== false) // Если статус Сети не рабочий
    {
        $network_status =1; // Фиксируем это состояние с помощью флага
    }
    
    $mining = shell_exec("awk '/Mining/ {print}' status.txt"); // Считываем сколько запущено майнеров
    
    if (strpos($mining, 'STARTED - 1') !== false ) // Здесь на Ноде запущен 1 майнер, если у вас больше - устанавливаете количество согласно вашему
    
    {
        $mining_status=1; // Если количество майнеров не такое как должно быть - фиксируем это с помощью флага
    }
    
    $syncer = shell_exec("awk '/Syncer/ {print}' status.txt"); // Считываем статус синхронизации
    
    if (strpos($syncer, 'IDLE') !== false ) // Если статус не рабочий
    
    {
        $syncer_status = 1; // фиксируем это с помощью флага
    }
    
    $current_blocks = (int) substr(substr($mining, -8),0,1); // Записываем сколько есть смайненных блоков
    $was_blocks = (int) file_get_contents('was_blocks.txt'); // Выясняем сколько блоков было ранее
    
    if ($current_blocks > $was_blocks) // Если количество смайненных блоков в данный момент больше чем было
    {
    
    $blocks_diff = $current_blocks - $was_blocks;    // Считаем разницу
    
    file_get_contents("https://api.telegram.org/bot1234567891:ASDFcsdfsfdMofSffddssfRRggfgfgddfFDFDw/sendMessage?chat_id=123456789&text=[Node 1] MINED A BLOCK: ".$blocks_diff); // Сообщаем себе сколько блоков было смайненно
    
    file_put_contents('was_blocks.txt',$current_blocks); // Обновляем количество блоков
    
    } else {
    
        if ($current_blocks < $was_blocks) // Если текущее количество смайненных блоков меньше чем было ( после перезагрузки например стало показывать 0)
        {
        file_put_contents('was_blocks.txt',$current_blocks); // Указываем это количество в файл с которым будем сверяться в следующий раз
        }
    
    }
    
    if ($node_status != 1 || $network_status != 1 ) // Если статус ноды или сети НЕ ОК
    {
        shell_exec('./restart_node.sh'); // рестарт ноды
            file_get_contents("https://api.telegram.org/bot1234567891:ASDFcsdfsfdMofSffddssfRRggfgfgddfFDFDw/sendMessage?chat_id=123456789&text=NODE 1 RESTARTED DUE TO NETWORK"); // сообщаем о запуске
        shell_exec('./run_mi.sh'); // запускаем майнер
    }
    
    unlink('status.txt'); // удаляем файл с данными о статусе
    
    $time_end = microtime(true); // записываем время завершения скрипта
    
    $time = $time_end - $time_start; // считаем разницу
    
    file_put_contents('time.txt',$time); // записываем время выполнения в файл
    file_put_contents('pid.txt','nopid'); // если все прошло хорошо - перезаписываем ID процесса значением nopid
    ?>
  • Скрипт проверки управляющего скрипта 2.php ( Нужен на случай если управляющий скрипт залипнет, что случается. )

    Код:
    <?php
    $ctime = file_get_contents('time.txt'); // время выполнения скрипта
    $pid= file_get_contents('pid.txt'); // файл с информацией о выполнении скрипта 1.php ( если были ошибки там будет process id)
    
    if ( $ctime>15 || empty($ctime) || $pid!=="nopid" ) // Если время выполнения скрипта 1.php более 15 секунд ИЛИ нет информации о времени выполнения скрипта 1.php ИЛИ есть ID процесса в файле pid.txt
    {
    
        exec("kill -9 $pid"); // останавливаем выполнение скрипта 1.php
        shell_exec('./stop_node.sh'); // останавливаем ноду
        sleep(90); // ждем
        shell_exec('./start_node.sh'); // запускаем ноду
        sleep(30);    // ждем
            shell_exec('./run_mi.sh'); // запускаем майнер
    
    file_get_contents("https://api.telegram.org/bot1234567891:ASDFcsdfsfdMofSffddssfRRggfgfgddfFDFDw/sendMessage?chat_id=123456789&text=".$pid." NODE [1] RESTARTED"); // Cообщаем о случившемся собитии
    }
    
    unlink('time.txt'); // удаляем файл с информацией о времени выполнения скрипта 1.php
    ?>

    Информация о том как работать с редактором vi, как сделать телеграм бот, установить PHP - есть здесь


    Чтобы настроить проверку на интервал раз в 5 минут запускаем

    Код:
    crontab -e

    Код:
    */5 * * * * /usr/bin/php /root/1.php & sleep 30 ; /usr/bin/php /root/2.php

    Если все выполнено правильно - нода сама перезагрузится в случае проблем, и сообщит о смайненном блоке.

    Не забывайте отключать проверку при обновлении ноды.
 
Последнее редактирование:
Вверх