Розглянемо, як за допомогою PowerShell перевірити, запущено чи певний додаток або процес, як автоматично перезапустити його при збої, якщо його випадково закрив користувач або він став витікати (використовувати занадто багато оперативної пам’яті).

Раніше ми показували, як за допомогою PowerShell можна управляти процесами Windows. Щоб перевірити, чи запущений процес notepad.exe і перезапустити його, можна використовувати такий скрипт.

If (!(Get-Process -Name notepad -ErrorAction SilentlyContinue))
{Invoke-Item C:Windowsnotepad.exe
}

Можна автоматично перезапустити процес, якщо він не відповідає (завис) або якщо він став використовувати занадто багато оперативної пам’яті (в цьому прикладі більше 500 Мб):

$proc = Get-Process -Name notepad| Sort-Object -Property ProcessName -Unique
If (($proc.Responding -eq $false) –or ($proc.WorkingSet -GT 500000*1024)} {
$proc.Kill()
Start-Sleep -s 10
Invoke-Item C:Windowsnotepad.exe
}

За допомогою for можна зробити нескінченний цикл, який запускає процес, кожні 60 секунд перевіряє що він запущений і перезапускає його, якщо потрібно:

for(;;)
{
try
{
If (!(Get-Process -Name notepad -ErrorAction SilentlyContinue))
{Invoke-Item C:Windowsnotepad.exe
}
$proc = Get-Process -Name notepad | Sort-Object -Property ProcessName -Unique -ErrorAction SilentlyContinue
If (!$proc -or ($proc.Responding -eq $false) –or ($proc.WorkingSet -GT 200000*1024)) {
$proc.Kill()
Start-Sleep -s 10
Invoke-Item C:Windowsnotepad.exe
}
}
catch
{
}
Start-sleep -s 60
}

powershell як перезапустити процес або додаток, якщо його закрили або воно зависло

Якщо потрібно перевірити стан процесу на віддалених комп’ютерах, можна використовувати команду:

$proc = Get-Process -ComputerName PC01 -Name notepad | Sort-Object -Property ProcessName -Unique -ErrorAction SilentlyContinue

Для віддаленого запуску процесу можна використовувати Invoke-Command:

Invoke-Command -ComputerName PC01 -Credential $Cred -ScriptBlock {Start-Process C:Windowsnotepad.exe -wait -verb runas;}

Ви можете запустити цей PowerShell скрипт у вигляді логон скрипта GPO при вході користувача.

В цьому випадку потрібно зберегти PowerShell код у файлі з розширенням PS1. Можна підписати цей скрипт цифровим підписом, змінити налаштування політики запуску PowerShell скриптів, або запускати його з параметром –ExecutionPolicy Bypass.

  • Ім’я запускається файлу: %windir%System32WindowsPowerShellv1.0powershell.exe
  • Параметри запуску: -windowstyle hidden -ExecutionPolicy Bypass –Noprofile -file %~dp0CheckProcess.ps1

Також можна запускати PS1 скрипт за розкладом за допомогою завдання планувальника. Використовуйте аналогічні параметри запуску. Додатково можна вказати обліковий запис користувача, від імені якого запускати процес.

$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-windowstyle hidden -ExecutionPolicy Bypass -file %windir%CheckProcess.ps1"
$Trigger= New-ScheduledTaskTrigger -AtLogon
$Principal=New-ScheduledTaskPrincipal -UserId "aaivanov" -LogonType Interactive
$Task=New-ScheduledTask -Action $Action -Trigger $Trigger -Principal $Principal
Register-ScheduledTask -TaskName "Check Notepad Process" -InputObject $Task

Або цей PowerShell скрипт можна запускати у вигляді служби Windows

Якщо в занедбаному додатку не потрібно взаємодія з користувачем, найкраще запускати його у вигляді служби. Надалі ви можете керувати цією службою через стандартну консоль services.msc або через PowerShell. У Windows є вбудований функціонал перезапуску служб або ви можете перезапускати зависла службу так.

Leave a Reply

Your email address will not be published. Required fields are marked *