Альтернатива аппаратным вочдогам

watchdog

#1

Всем хороши аппаратные вочдоги, кроме одного - на старых мат.платах они не могут следить за включением рига. Т.к. для того, что бы вочдог заработал должно появиться питание в USB порту, а на старушках этого не происходит. Конечно, в БИОСе можно выставить автоматическое включение при подаче питания, но практика показывает, что срабатывает это далеко не всегда.
Идея заключается в том, что бы использовать вместо аппаратных вочдогов USB-реле, которые будут замыкать контакты reset\power на мат плате, что бы перезагрузить риг, если тот перестанет пинговаться. Разумеется эти реле нужно включать в другой компьютер, который будет следить за доступностью рига, или например в роутер, если он прошит нормальной прошивкой типа openWRT. Впрочем, если у Вас два и более рига, то они смогут следить друг за другом. Или можно купить аппаратный вочдог с резервной батареей для одного рига, и подключить к нему реле для слежки за остальными ригами.
Реле я купил тут
Это двухканальная модель, можно купить одноканальную, или четырёх и более канальные, в зависимости от Ваших потребностей, разницы нет.
Для работы реле потребуется установить эту упраляющую ими совтину
Если на одном компьютере используется несколько реле, то нужно сменить серийные имена их портов, т.к. по умолчанию они у всех реле одинаковые, но если реле одно, то можно не менять.

Для управления реле я написал следующий скрипт, сохраните его в файле /root/ping_rig.sh:

#!/bin/bash
 HOST=192.168.1.101
 # serial name of USB relay port connected to power switch of HOST
 SERIAL=PSUIS_1
 # ping tries before reset
 MAX_PING_TRIES=100
 # reset count before script terminates
 MAX_RESETS=5
 # current reset #
 CUR_RESET=1

 while true
 do
  echo "Pinging $HOST"
  if ping -c 1 $HOST; then
   # HOST is responding - everything is fine 
   echo -e "\e[32m$HOST responds\e[0m"
   CUR_RESET=1
   #echo "$HOST responds"
  else   
   #host isn't responding - try to ping it for $MAX_PING_TRIES times
   echo -e "\e[31m$HOST not responding, trying for $MAX_PING_TRIES times\e[0m"
   
   # flag to know responds HOST or not
   B_PING=0
   
   for i in `seq 1 $MAX_PING_TRIES`; do
    echo -e "\e[31m$i\e[0m"
    #echo "$i"
    if ping -c 1 $HOST; then 
     # finally HOST's responded - changing the flag and reser CUR_RESET counter
     echo -e "\e[32m$HOST responds\e[0m"
     B_PING=1
     CUR_RESET=1
     break
    fi    
    sleep 1
   done
   if [ $B_PING -eq 0 ]; then 
    if [ $CUR_RESET -gt $MAX_RESETS ]; then 
     echo -e "\e[31mMax reset reached. Script terminates\e[0m" 
     break 
    fi
    echo -e "\e[31mReseting $HOST #$CUR_RESET\e[0m" 
    
    # power off the HOST by short-circuit power switch for 5 sec
    usbrelay "$SERIAL"=1
    sleep 5
    usbrelay "$SERIAL"=0
    # pause for 3 sec
    sleep 3
    # power on the HOST by short-circuit power switch for 0.05 sec
    usbrelay "$SERIAL"=1    
    sleep 0.05
    usbrelay "$SERIAL"=0
    
    # increasing CUR_RESET counter
    CUR_RESET=`expr $CUR_RESET + 1`
   fi
  fi
  sleep 10
 done 

Для его автозапуска нужно добавить в /etc/rc.local выше exit(0) следующую строку:
screen -dmS ping_rig . /root/ping_rig.sh

Так скрипт запустится в screen, как и майнеры. Его работу можно проверить по алиасу ping_rig.

Если нужно пинговать несколько ригов, то делаете копию скрипта, например /root/ping_rig_1.sh, меняете в ней адрес хоста и серийное имя порта на реле и добавляете её в автозагрузку.

На басурманский переводить не буду, пусть курят translate.google.com