Computer >> Máy Tính >  >> Hệ thống >> máy chủ Windows

Làm cách nào để tự động khởi động lại ứng dụng / quy trình bị lỗi hoặc bị đóng với PowerShell?

Hãy cùng tìm hiểu cách sử dụng PowerShell để kiểm tra xem một ứng dụng hoặc quy trình cụ thể có đang chạy hay không; cách khởi động lại nó tự động trong trường hợp gặp sự cố, nếu người dùng vô tình đóng nó hoặc nó bắt đầu ngốn một lượng lớn bộ nhớ (bộ nhớ bị rò rỉ).


Trước đó, chúng tôi đã hướng dẫn cách quản lý các quy trình của Windows bằng PowerShell. Để đảm bảo nếu quá trình notepad.exe đang chạy và khởi động lại nó, bạn có thể sử dụng tập lệnh bên dưới:

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

Bạn có thể tự động khởi động lại quá trình nếu quá trình không phản hồi (bị treo) hoặc nếu quá trình bắt đầu sử dụng quá nhiều bộ nhớ (trong ví dụ này là hơn 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
}

Sử dụng PowerShell for , bạn có thể tạo một vòng lặp vô tận để bắt đầu một quy trình, kiểm tra cứ sau 60 giây nếu nó đang chạy và khởi động lại nếu cần:

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
}

Làm cách nào để tự động khởi động lại ứng dụng / quy trình bị lỗi hoặc bị đóng với PowerShell?

Nếu bạn muốn kiểm tra trạng thái của một quá trình trên máy tính từ xa, bạn có thể sử dụng lệnh này:

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

Để bắt đầu một quá trình từ xa, bạn có thể sử dụng lệnh ghép ngắn Invoke-Command:

Invoke-Command -ComputerName WKS-NYC211 -Credential $Cred -ScriptBlock {Start-Process C:\Windows\notepad.exe -wait -verb runas;}

Bạn có thể chạy tập lệnh PowerShell này dưới dạng tập lệnh đăng nhập GPO khi đăng nhập người dùng.

Sau đó, lưu mã PowerShell vào tệp có đuôi * .PS1. Bạn có thể ký tập lệnh bằng chữ ký điện tử, thay đổi cài đặt chính sách Thực thi PowerShell hoặc chạy tập lệnh với –ExecutionPolicy Bypass tùy chọn.

  • Tên tệp:%windir%\System32\WindowsPowerShell\v1.0\powershell.exe
  • Các tùy chọn đang chạy:-windowstyle hidden -ExecutionPolicy Bypass –Noprofile -file %~dp0CheckProcess.ps1

Bạn cũng có thể chạy tập lệnh PS1 theo lịch trình bằng Bộ lập lịch tác vụ. Sử dụng các tùy chọn chạy giống nhau. Bạn cũng có thể chỉ định tài khoản người dùng mà bạn muốn chạy quy trình.

$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

Hoặc bạn có thể chạy tập lệnh PowerShell này dưới dạng dịch vụ Windows.

Nếu ứng dụng đang chạy không cần tương tác với người dùng, tốt hơn nên chạy nó như một dịch vụ. Sau đó, bạn sẽ có thể quản lý nó thông qua services.msc tiêu chuẩn bảng điều khiển hoặc với PowerShell. Windows được tích hợp sẵn tính năng khởi động lại dịch vụ hoặc bạn có thể khởi động lại dịch vụ bị treo như sau.