Приведенный пример сделан на коленке на скорую руку лично для себя, выкладываю потому что много спрашивают.
Для запуска мониторинга ноды понадобятся исполняемые файлы запуска / перезагрузки ноды / майнера- 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
- Управляющий скрипт 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
Если все выполнено правильно - нода сама перезагрузится в случае проблем, и сообщит о смайненном блоке.
Не забывайте отключать проверку при обновлении ноды.
Последнее редактирование: