이 글에서는 PowerShell을 활용해 특정 애플리케이션이나 프로세스가 실행 중인지 확인하는 방법과, 프로세스가 충돌하거나 사용자가 실수로 닫았거나 메모리를 과도하게 사용(메모리 누수)하는 경우 자동으로 재시작하는 방법을 알아보겠습니다.
프로세스 실행 여부 확인 후 자동 실행하기
이전에 PowerShell을 사용해 Windows 프로세스를 관리하는 방법을 소개한 바 있습니다. notepad.exe 프로세스가 실행 중인지 확인하고, 실행되어 있지 않으면 다시 시작하려면 아래 스크립트를 사용할 수 있습니다.
If (!(Get-Process -Name notepad -ErrorAction SilentlyContinue))
{Invoke-Item C:\Windows\notepad.exe
}응답 없음 또는 과도한 메모리 사용 시 프로세스 재시작
프로세스가 응답하지 않거나(멈춤), 메모리를 너무 많이 사용하기 시작한 경우(이 예시에서는 1000MB 초과) 자동으로 재시작할 수도 있습니다.
$proc = Get-Process -Name notepad | Sort-Object -Property ProcessName -Unique
If (($proc.Responding -eq $false) –or ($proc.WorkingSet -GT 1000000*1024)) {
$proc.Kill()
Start-Sleep -s 10
Invoke-Item C:\Windows\notepad.exe
}무한 루프로 지속적인 프로세스 모니터링
PowerShell의 for 루프를 사용하면 프로세스를 시작한 뒤 60초마다 실행 여부를 확인하고, 필요하면 자동으로 재시작하는 무한 루프를 만들 수 있습니다.
for(;;){
try{
If (!(Get-Process -Name notepad -ErrorAction SilentlyContinue))
{Invoke-Item C:\Windows\notepad.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:\Windows\notepad.exe}
}
catch { }
Start-sleep -s 60
}원격 컴퓨터의 프로세스 확인 및 시작
원격 컴퓨터에서 프로세스 상태를 확인하려면 아래 명령어를 사용합니다.
$proc = Get-Process -ComputerName WKS-NYC211 -Name notepad | Sort-Object -Property ProcessName -Unique -ErrorAction SilentlyContinue원격으로 프로세스를 시작하려면 Invoke-Command cmdlet을 사용할 수 있습니다.
Invoke-Command -ComputerName WKS-NYC211 -Credential $Cred -ScriptBlock {Start-Process C:\Windows\notepad.exe -wait -verb runas;}GPO 로그온 스크립트로 실행하기
이 PowerShell 스크립트는 사용자 로그온 시 실행되는 GPO 로그온 스크립트로 활용할 수 있습니다. 먼저 PowerShell 코드를 *.PS1 확장자를 가진 파일로 저장합니다. 이후 스크립트에 디지털 서명을 하거나, PowerShell 실행 정책 설정을 변경하거나, –ExecutionPolicy Bypass 옵션으로 스크립트를 실행하면 됩니다.
- 파일 이름:
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe - 실행 옵션:
-windowstyle hidden -ExecutionPolicy Bypass –Noprofile -file %~dp0CheckProcess.ps1
작업 스케줄러로 예약 실행하기
작업 스케줄러(Task Scheduler)를 사용하면 PS1 스크립트를 주기적으로 실행할 수도 있습니다. 이때도 동일한 실행 옵션을 사용하며, 프로세스를 실행할 사용자 계정을 별도로 지정하는 것도 가능합니다.
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-windowstyle hidden -ExecutionPolicy Bypass -file %windir%\CheckProcess.ps1"
$Trigger= New-ScheduledTaskTrigger -AtLogon
$Principal=New-ScheduledTaskPrincipal -UserId "jsmith" -LogonType Interactive
$Task=New-ScheduledTask -Action $Action -Trigger $Trigger -Principal $Principal
Register-ScheduledTask -TaskName "Check Notepad Process" -InputObject $TaskWindows 서비스로 실행하기
또는 이 PowerShell 스크립트를 Windows 서비스로 실행할 수도 있습니다. 실행 중인 앱이 사용자와의 상호작용이 필요 없다면 서비스 형태로 실행하는 것이 더 좋습니다. 이후에는 표준 services.msc 콘솔이나 PowerShell을 통해 손쉽게 관리할 수 있습니다. Windows에는 서비스 자동 재시작 기능이 기본으로 내장되어 있으며, 응답하지 않는 서비스도 다음과 같은 방법으로 재시작할 수 있습니다.