มาเรียนรู้วิธีใช้ PowerShell เพื่อตรวจสอบว่าแอปพลิเคชันหรือกระบวนการเฉพาะกำลังทำงานอยู่หรือไม่ วิธีรีสตาร์ทมันอัตโนมัติในกรณีที่ Crash หากผู้ใช้ปิดมันโดยไม่ได้ตั้งใจ หรือมันเริ่มใช้หน่วยความจำจำนวนมาก (Memory Leak)
ก่อนหน้านี้เราแสดงวิธีจัดการกระบวนการ Windows โดยใช้ PowerShell เพื่อให้แน่ใจว่าโปรเซส notepad.exe กำลังทำงานและรีสตาร์ทมัน คุณสามารถใช้สคริปต์ด้านล่าง:
If (!(Get-Process -Name notepad -ErrorAction SilentlyContinue))
{Invoke-Item C:\Windows\notepad.exe
}
คุณสามารถรีสตาร์ทกระบวนการอัตโนมัติหากมันไม่ตอบสนอง (ค้าง) หรือหากมันเริ่มใช้หน่วยความจำมากเกินไป (มากกว่า 1000 MB ในตัวอย่างนี้):
$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
}
โดยใช้ลูป for ของ PowerShell คุณสามารถสร้างลูปไม่รู้จบที่เริ่มกระบวนการ ตรวจสอบทุก 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;}
คุณสามารถรันสคริปต์ PowerShell นี้เป็น GPO Logon Script เมื่อผู้ใช้เข้าสู่ระบบ
จากนั้นบันทึกโค้ด PowerShell ลงในไฟล์ที่มีนามสกุล *.PS1 คุณสามารถลงนามสคริปต์ด้วยลายเซ็นดิจิทัล เปลี่ยนการตั้งค่า PowerShell Execution Policy หรือรันสคริปต์ด้วยตัวเลือก –ExecutionPolicy Bypass
- ชื่อไฟล์:
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe - ตัวเลือกการรัน:
-windowstyle hidden -ExecutionPolicy Bypass –Noprofile -file %~dp0CheckProcess.ps1
คุณยังสามารถรันสคริปต์ PS1 ตามตารางเวลาโดยใช้ Task Scheduler ใช้ตัวเลือกการรันเดียวกัน คุณยังสามารถระบุบัญชีผู้ใช้ที่คุณต้องการให้รันกระบวนการได้
$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 $Task
หรือคุณสามารถรันสคริปต์ PowerShell นี้เป็นบริการ Windows
หากแอปที่กำลังทำงานไม่จำเป็นต้องโต้ตอบกับผู้ใช้ จะดีกว่าที่จะรันมันเป็นบริการ ต่อไป คุณจะสามารถจัดการมันผ่านคอนโซลมาตรฐาน services.msc หรือด้วย PowerShell Windows มีคุณสมบัติในตัวสำหรับการรีสตาร์ทบริการ หรือคุณสามารถรีสตาร์ทบริการที่ค้างได้ดังนี้