Windows PowerShell에서 Process cmdlet을 사용하여 Windows PowerShell의 로컬 및 원격 프로세스를 관리할 수 있습니다.
프로세스 가져오기(Get-Process)
로컬 컴퓨터에서 실행 중인 프로세스를 가져오려면 Get-Process를 매개 변수 없이 실행합니다.
프로세스 이름 또는 프로세스 ID를 지정하여 특정 프로세스를 가져올 수 있습니다. 다음 명령은 Idle 프로세스를 가져옵니다.
PS> Get-Process -id 0 Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 0 0 0 16 0 0 Idle
일반적으로 cmdlet이 아무 데이터도 반환하지 않아도 오류 메시지가 나타나지 않지만 ProcessId를 사용하여 프로세스를 지정한 경우 Get-Process가 일치하는 항목을 찾지 못하면 오류 메시지가 나타납니다. 이 cmdlet의 기본 목적이 실행 중인 프로세스를 검색하는 것이기 때문입니다. 해당 Id를 가진 프로세스가 없으면 Id가 잘못되었거나 해당 프로세스가 이미 종료된 것일 수 있습니다.
PS> Get-Process -Id 99 Get-Process : No process with process ID 99 was found. At line:1 char:12 + Get-Process <<<< -Id 99
Get-Process cmdlet의 Name 매개 변수를 사용하면 프로세스 이름을 기반으로 프로세서의 하위 집합을 지정할 수 있습니다. Name 매개 변수는 여러 개의 이름을 쉼표로 구분된 목록으로 받아들일 수 있으며 와일드카드 사용을 지원하기 때문에 사용자는 이름 패턴을 입력할 수 있습니다.
예를 들어 다음 명령은 이름이 "ex"로 시작되는 프로세스를 가져옵니다.
PS> Get-Process -Name ex* Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 234 7 5572 12484 134 2.98 1684 EXCEL 555 15 34500 12384 134 105.25 728 explorer
.NET System.Diagnostics.Process 클래스는 Windows PowerShell 프로세스의 기초이므로 System.Diagnostics.Process가 사용하는 일부 규칙을 따릅니다. 이러한 규칙 중 하나는 실행 파일의 프로세스 이름에 ".exe" 확장명을 포함하지 않는 것입니다.
Get-Process는 또한 Name 매개 변수에 대해 여러 값을 허용합니다.
PS> Get-Process -Name exp*,power* Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 540 15 35172 48148 141 88.44 408 explorer 605 9 30668 29800 155 7.11 3052 powershell
Get-Process의 ComputerName 매개 변수를 사용하여 원격 컴퓨터의 프로세스를 가져올 수 있습니다. 예를 들어 다음 명령은 로컬 컴퓨터("localhost"로 표현됨)에 있는 PowerShell 프로세스와 두 개의 원격 컴퓨터에 있는 PowerShell 프로세스를 가져옵니다.
PS> Get-Process -Name PowerShell -ComputerName localhost, Server01, Server02 Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 258 8 29772 38636 130 3700 powershell 398 24 75988 76800 572 5816 powershell 605 9 30668 29800 155 7.11 3052 powershell
이 표시에서는 컴퓨터 이름이 분명히 나타나지 않지만 Get-Process가 반환하는 프로세스 개체의 MachineName 속성에 저장됩니다. 다음 명령은 Format-Table cmdlet을 사용하여 프로세스 개체의 프로세스 ID, ProcessName 및 MachineName(ComputerName) 속성을 표시합니다.
PS> Get-Process -Name PowerShell -ComputerName localhost, Server01, Server01 | Format-Table -Property ID, ProcessName, MachineName Id ProcessName MachineName -- ----------- ----------- 3700 powershell Server01 3052 powershell Server02 5816 powershell localhost
더욱 복잡한 이 명령은 MachineName 속성을 표준 Get-Process 표시에 추가합니다. 역음(`)(ASCII 96)은 Windows PowerShell의 연속 문자입니다.
get-process powershell -computername localhost, Server01, Server02 | format-table -property Handles, ` @{Label="NPM(K)";Expression={[int]($_.NPM/1024)}}, ` @{Label="PM(K)";Expression={[int]($_.PM/1024)}}, ` @{Label="WS(K)";Expression={[int]($_.WS/1024)}}, ` @{Label="VM(M)";Expression={[int]($_.VM/1MB)}}, ` @{Label="CPU(s)";Expression={if ($_.CPU -ne $()` {$_.CPU.ToString("N")}}}, ` Id, ProcessName, MachineName -auto Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName MachineName ------- ------ ----- ----- ----- ------ -- ----------- ----------- 258 8 29772 38636 130 3700 powershell Server01 398 24 75988 76800 572 5816 powershell localhost 605 9 30668 29800 155 7.11 3052 powershell Server02
프로세스 중지(Stop-Process)
Windows PowerShell에서는 다양한 방법으로 프로세스를 표시할 수 있을 뿐 아니라 프로세스를 중지할 수도 있습니다.
Stop-Process cmdlet은 이름이나 Id를 사용하여 중지할 프로세스를 지정합니다. 프로세스를 중지할 수 있는지 여부는 사용 권한에 의해 결정됩니다. 일부 프로세스는 중지할 수 없습니다. 예를 들어 유휴 프로세스를 중지하려고 하면 다음과 같은 오류 메시지가 나타납니다.
PS> Stop-Process -Name Idle Stop-Process : Process 'Idle (0)' cannot be stopped due to the following error: Access is denied At line:1 char:13 + Stop-Process <<<< -Name Idle
또한 강제로 Confirm 매개 변수를 사용하도록 지정할 수도 있습니다. 이 매개 변수는 프로세스 이름을 지정할 때 와일드카드를 사용할 경우 원하지 않는 프로세스가 중지될 수 있으므로 특히 유용합니다.
PS> Stop-Process -Name t*,e* -Confirm Confirm Are you sure you want to perform this action? Performing operation "Stop-Process" on Target "explorer (408)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):n Confirm Are you sure you want to perform this action? Performing operation "Stop-Process" on Target "taskmgr (4072)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):n
일부 개체 필터링 cmdlet을 사용하면 복잡한 프로세스 조작이 가능합니다. 프로세스 개체에는 더 이상 응답이 없을 때 true인 응답 속성이 있으므로 다음 명령을 사용하여 응답이 없는 모든 응용 프로그램을 중지할 수 있습니다.
Get-Process | Where-Object -FilterScript {$_.Responding -eq $false} | Stop-Process
위와 동일한 방법을 다른 경우에 사용할 수도 있습니다. 예를 들어 다른 응용 프로그램을 시작하면 보조 알림 영역 응용 프로그램이 자동으로 실행된다고 가정할 경우 이 보조 알림 영역 응용 프로그램이 터미널 서비스 세션에서 올바로 작동하지 않는 것을 알았지만 실제 컴퓨터 콘솔에서 실행되는 세션에서 이 응용 프로그램을 계속 실행할 수 있습니다. 실제 컴퓨터의 데스크톱에 연결된 세션에는 항상 세션 ID로 0이 지정되므로 다음과 같이 Where-Object와 SessionId 프로세스를 사용하여 다른 세션에 있는 프로세스의 인스턴스를 모두 중지할 수 있습니다.
Get-Process -Name BadApp | Where-Object -FilterScript {$_.SessionId -neq 0} | Stop-Process
Stop-Process cmdlet에는 ComputerName 매개 변수가 없습니다. 따라서 원격 컴퓨터에서 프로세스 중지 명령을 실행하려면 Invoke-Command cmdlet을 사용해야 합니다. 예를 들어 Server01 원격 컴퓨터에서 PowerShell 프로세스를 중지하려면 다음과 같이 입력하십시오.
Invoke-Command -ComputerName Server01 {Stop-Process Powershell}
다른 모든 Windows PowerShell 세션 중지
경우에 따라 현재 세션을 제외하고 실행 중인 다른 모든 Windows PowerShell 세션을 중지할 수 있는 것이 유용할 수 있습니다. 세션에서 너무 많은 리소스를 사용하고 있거나 세션에 액세스할 수 없으면(원격에서 실행 중이거나 다른 데스크톱 세션에서 실행 중인 경우) 세션을 직접 중지하지 못할 수 있습니다. 그러나 실행 중인 세션을 중지하려고 하면 대신 현재 세션이 중지될 수 있습니다.
각 Windows PowerShell 세션에는 Windows PowerShell 프로세스의 Id가 들어 있는 환경 변수 PID가 있습니다. 각 세션의 Id에 대해 $PID를 확인하고 다른 Id를 가진 Windows PowerShell 세션만 중지할 수 있습니다. 다음 파이프라인 명령은 이 작업을 수행하고 종료된 세션의 목록을 반환합니다. 이 명령이 종료된 세션의 목록을 반환하는 것은 PassThru 매개 변수를 사용하기 때문입니다.
PS> Get-Process -Name powershell | Where-Object -FilterScript {$_.Id -ne $PID} | Stop-Process - PassThru Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 334 9 23348 29136 143 1.03 388 powershell 304 9 23152 29040 143 1.03 632 powershell 302 9 20916 26804 143 1.03 1116 powershell 335 9 25656 31412 143 1.09 3452 powershell 303 9 23156 29044 143 1.05 3608 powershell 287 9 21044 26928 143 1.02 3672 powershell
프로세스 시작, 디버깅 및 대기
Windows PowerShell에는 프로세스를 시작(또는 다시 시작)하고, 프로세스를 디버깅하고, 명령을 실행하기 전에 프로세스의 완료를 기다리는 cmdlet도 함께 제공됩니다. 이러한 cmdlet에 대한 자세한 내용은 각 cmdlet의 cmdlet 도움말 항목을 참조하십시오.
참고 항목