Здравствуйте Гость [ Вход | Регистрация ] | Форум в сети 6811-й день

Шановні користувачі! Запрошуємо вас до офіційного телеграм-канала 0day Community. Тут ви зможете поспілкуватися одне з одним та дізнатися про останні новини щодо роботи ресурса, поставити запитання до адміністрації, тощо. Перейти до телеграм-канала можна відсканувавши QR-код або натиснувши на посилання: @zeroday_ua

 Автовимикання серваків при відключенні електропостачання, скрипт на вимкнення

DjSchum@cher
Jun 12 2024, 7:48
  
Пост #1



Репутация:   18  
Дух


Группа: Пользователи
Сообщений: 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 серваки не вирубаються в заблоченому стані. А при наявності цього параметра в скрипті серваки вирубаються некоректно. Чи вірно це? Може хто що ще порадить? Дуже дякую.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topic
Ответов(1 - 3)
Mad Dog
Jun 12 2024, 10:50
  
Пост #2



Репутация:   108  
Старожил
****

Группа: Пользователи
Сообщений: 3 566
С нами с: 31-October 06


(DjSchum@cher @ Jun 12 2024, 8:48) Перейти к цитате

Питання в тому, що без параметра -force серваки не вирубаються в заблоченому стані. А при наявності цього параметра в скрипті серваки вирубаються некоректно. Чи вірно це? Може хто що ще порадить? Дуже дякую.

Замість -Force можна використовувати -Wait 30. Воно дасть 30 секунд на коректне завершення роботи а потім відпрацює по принципу "-Force".
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
sir
Jun 19 2024, 9:58
  
Пост #3



Репутация:   89  
Постоялец
***

Группа: Пользователи
Сообщений: 1 165
С нами с: 13-May 09


А ДБЖ точно не вміє вимикати сервер? Яка модель ?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
mak_v_
Jun 23 2024, 21:27
  
Пост #4



Репутация:   440  
Скорострел
*****

Группа: Пользователи
Сообщений: 7 453
С нами с: 4-December 11


(sir @ Jun 19 2024, 9:58) Перейти к цитате

А ДБЖ точно не вміє вимикати сервер? Яка модель ?

Якщо скрипти не самоціль, то https://networkupstools.org/
Можна все шо хош налаштувати.
https://www.synoforum.com/resources/windows...etwork-ups.158/ звідси можна почати

Сообщение отредактировал mak_v_ - Jun 23 2024, 21:30
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Reply to this topicStart new topic

 



- Упрощённая версия
Сейчас: 7th November 2024 - 1:50
Сайт не розміщує електронні версії творів, а займається лише колекціонуванням та каталогізацією посилань, що публікуються нашими користувачами. Якщо Ви є правовласником якоїсь частини опублікованого матеріалу та не бажаєте, щоб посилання на нього знаходилось в нашому каталозі, зв’яжіться з нами і ми видалимо його. Файли для обміну надані користувачами сайту і адміністрація не несе відповідальності за їх вміст.