Аппаратная перезагрузка сервера или майнера при зависании

Если сервер или майнинг ферма стоят далеко, и нет возможности при зависании перезагрузить, можно применить связку софта+железа для нажатия кнопочки reset. В данной статье я расскажу как я реализовал эту функцию для перезагрузки Windows сервера. Все было сделано на скорую руку, временно, на коленке, ну и как полагается работает уже много лет …

Алгоритм простой — нужно что то отправлять с компьютера. Если контроллер получает информацию — значит сервер или майнер работает. Если перестал получать, через Х секунд делаем reset. На быструю руку, без каких либо попыток сделать код красивым и идеальным настругал для nano следующий код:

int LedPin = 13;
int ResetPin = 2;
int val = 0;
int count = 0;
void setup() 
{
  Serial.begin(9600);
  pinMode(LedPin,OUTPUT);
  pinMode(ResetPin,OUTPUT);
  //пауза на запуск 2 мин
  delay (30000);
}

void loop() 
{
    count++ ; 
    
    if (Serial.available() > 0) 
    {
      val = Serial.read();
      if (val == 'H') 
        {
          digitalWrite(LedPin,LOW);
          digitalWrite(ResetPin,LOW);
          count = 0;
        } 
          else 
        {          count++ ; 
        }
    }  
  
  delay (1000);
   
  if (count > 180) 
  {
    digitalWrite(LedPin,HIGH); 
    digitalWrite(ResetPin,HIGH);
    delay (1000);
    digitalWrite(LedPin,LOW);
    digitalWrite(ResetPin,LOW);
    count = 0;
  }
}

На pin 2 установил резистор для ограничения тока. Вроде как 20кОм (не помню) и подключил к ноге reset на материнской плате.

В windows задача делится на два этапа:
1. Делаем Power Shell скрипт который в uart шлет бесконечно символ H (для нашего МК это значит все ОК).

(Get-Date).ToString('dd.MM.yyyy   HH:mm')  | Out-File C:\Users\User\Desktop\reboot.txt  -append

while($TRUE){
Start-Sleep -s 3
$port= new-Object System.IO.Ports.SerialPort COM3,9600,None,8,one
$port.open()
$port.WriteLine("H")
$port.Close()
}

И в автозагрузку добавляем bat файл, который этот Power Shell скрипт будет запускать при загрузке компьютера:

start %SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powerShell.exe -ExecutionPolicy ByPass -File "C:\Users\User\Desktop\test.ps1"

В результате при загрузке компьютера bat файл загружает power shell скрипт, и тот начинает в uart слать бесконечно символ Н.
Если по какой то причине МК не получил символ Н, по истечению таймаута компьютер перезагрузится.

Этот костыль отлично работает у меня, и у других людей кто это все повторял. Но у него есть куча минусов, да он собственно и не претендовал на то чтобы быть чем то сверх грамотным.
Это было сделано на коленке за пару минут, и работает несколько лет.

Какие могут быть проблемы?
1. При маленьком таймауте — система может не успеть загрузиться
2. Если система не загрузилась — то оно будет ребутаться постоянно
3. Если не поставить резистор на провод reset, можно спалить МК

Данная статья написана не для того чтобы сподвигнуть кого то на повторение, а лишь чтобы напомнить мне когда в очередной раз пригодится — как я это делал.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *