PowerShell: автоматический перезапуск приложения/процесса при сбое

PowerShell: автоматический перезапуск приложения/процесса при сбое

Рассмотрим, как с помощью 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 есть встроенный функционал перезапуска служб либо вы можете перезапускать зависшую службу так.

Windows 10
PowerShell: автоматический перезапуск приложения/процесса при сбое