Автовимикання серваків при відключенні електропостачання, скрипт на вимкнення |
Здравствуйте Гость [ Вход | Регистрация ] | Форум в сети 6737-й день
![]() |
Шановні користувачі! Запрошуємо вас до офіційного телеграм-канала 0day Community. Тут ви зможете поспілкуватися одне з одним та дізнатися про останні новини щодо роботи ресурса, поставити запитання до адміністрації, тощо. Перейти до телеграм-канала можна відсканувавши QR-код або натиснувши на посилання: @zeroday_ua |
Автовимикання серваків при відключенні електропостачання, скрипт на вимкнення |
DjSchum@cher |
Пост
#1
|
Репутация: ![]() ![]() Дух Группа: Пользователи Сообщений: 91 С нами с: 23-May 08 ![]() |
Доброго всім! Хочу зробити скрипт, при якому серваки коректно завершують свою роботу тоді коли відключають електропостачання. Серваки на win serv 2022. 2 КД та відмовостійкий dhcp. Коли зникає світло, то мережеве обладнання вимикається і серваки не можуть пінгувати один одного. Серваки підключені до ДБЖ.
Принцип такий: 20-хвилинна затримка: Перші 20 хвилин скрипт не перевіряє з'єднання між серверами. Це робиться для того, щоб дати серверам час повністю завантажитись і підготуватись до роботи. Кожні 60 секунд скрипт перевіряє, чи минули вже 20 хвилин, і якщо ні, робить паузу ще на 60 секунд. Перевірка режиму технічного обслуговування: Після закінчення 20 хвилин скрипт перевіряє, чи існує файл-флаг maintenance.flag. Якщо файл-флаг існує, скрипт не перевіряє з'єднання і робить паузу на 60 секунд. Перевірка з'єднання: Якщо файл-флаг не існує, скрипт перевіряє з'єднання між серверами, намагаючись пінгувати інший сервер. Якщо з'єднання є: Якщо пінг успішний, скрипт робить паузу на 60 секунд і повторює перевірку. Якщо з'єднання втрачене: Якщо пінг не успішний, скрипт записує це в журнал і починає інтенсивну перевірку, пінгуючи інший сервер кожні 10 секунд протягом 1 хвилини. Якщо з'єднання відновлюється протягом цієї хвилини, скрипт записує це в журнал і повертається до перевірки кожні 60 секунд. Якщо з'єднання не відновлюється протягом 1 хвилини інтенсивної перевірки, скрипт записує це в журнал, чекає додаткову хвилину і коректно вимикає сервер. # IP адреса другого сервера $otherServerIP = "1.1.1.1" # Шлях до файлу журналу $logFilePath = "C:\Logs\ServerPing.log" # Шлях до файлу-флагу $flagFilePath = "C:\Scripts\maintenance.flag" # Час затримки в хвилинах після завантаження $delayMinutes = 20 # Функція для запису в журнал function Write-Log { param ( [string]$message ) $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" "$timestamp - $message" | Out-File -FilePath $logFilePath -Append } # Функція для перевірки з'єднання function Test-ServerConnection { param ( [string]$IPAddress ) $ping = Test-Connection -ComputerName $IPAddress -Count 1 -Quiet return $ping } # Основний цикл перевірки з'єднання while ($true) { try { # Перевірка часу роботи системи $uptime = (Get-CimInstance -ClassName Win32_OperatingSystem).LastBootUpTime $timeSinceBoot = (New-TimeSpan -Start $uptime).TotalMinutes if ($timeSinceBoot -lt $delayMinutes) { Write-Log "Skipping check due to initial 20-minute delay after boot." Start-Sleep -Seconds 60 continue } # Перевірка наявності файлу-флагу if (Test-Path $flagFilePath) { Write-Log "Maintenance mode enabled. Skipping shutdown check." Start-Sleep -Seconds 60 continue } $connectionOK = Test-ServerConnection -IPAddress $otherServerIP if (-not $connectionOK) { Write-Log "Initial connection to $otherServerIP failed. Starting intensive check." # Перевірка кожні 10 секунд протягом 1 хвилини $intensiveCheck = $false for ($i = 0; $i -lt 6; $i++) { Start-Sleep -Seconds 10 $connectionOK = Test-ServerConnection -IPAddress $otherServerIP if ($connectionOK) { $intensiveCheck = $true break } } if (-not $intensiveCheck) { Write-Log "Connection to $otherServerIP failed after intensive check. Initiating shutdown." Start-Sleep -Seconds 60 # Додаткова затримка перед вимкненням Stop-Computer -Force # Використання параметра -Force } else { Write-Log "Connection to $otherServerIP restored during intensive check. No shutdown required." } } Start-Sleep -Seconds 60 } catch { Write-Log "An error occurred: $_" } } Питання в тому, що без параметра -force серваки не вирубаються в заблоченому стані. А при наявності цього параметра в скрипті серваки вирубаються некоректно. Чи вірно це? Може хто що ще порадить? Дуже дякую. |
![]() ![]() |
Mad Dog |
Пост
#2
|
Репутация: ![]() ![]() Старожил ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 3 500 С нами с: 31-October 06 ![]() |
Питання в тому, що без параметра -force серваки не вирубаються в заблоченому стані. А при наявності цього параметра в скрипті серваки вирубаються некоректно. Чи вірно це? Може хто що ще порадить? Дуже дякую. Замість -Force можна використовувати -Wait 30. Воно дасть 30 секунд на коректне завершення роботи а потім відпрацює по принципу "-Force". |
sir |
Пост
#3
|
Репутация: ![]() ![]() Постоялец ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 162 С нами с: 13-May 09 ![]() |
А ДБЖ точно не вміє вимикати сервер? Яка модель ?
|
mak_v_ |
Пост
#4
|
Репутация: ![]() ![]() Скорострел ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 7 453 С нами с: 4-December 11 ![]() |
А ДБЖ точно не вміє вимикати сервер? Яка модель ? Якщо скрипти не самоціль, то https://networkupstools.org/ Можна все шо хош налаштувати. https://www.synoforum.com/resources/windows...etwork-ups.158/ звідси можна почати Сообщение отредактировал mak_v_ - Jun 23 2024, 21:30 |
![]() ![]() |
![]() |
Упрощённая версия | Сейчас: 25th August 2024 - 10:53 |
Сайт не розміщує електронні версії творів, а займається лише колекціонуванням та каталогізацією посилань, що публікуються нашими користувачами. Якщо Ви є правовласником якоїсь частини опублікованого матеріалу та не бажаєте, щоб посилання на нього знаходилось в нашому каталозі, зв’яжіться з нами і ми видалимо його. Файли для обміну надані користувачами сайту і адміністрація не несе відповідальності за їх вміст. |