Computer >> 컴퓨터 >  >> 시스템 >> Windows Server

PowerShell로 Windows 프로세스 관리하기: 조회부터 강제 종료, 원격 제어까지

PowerShell은 로컬 또는 원격 컴퓨터에서 실행되는 프로세스를 관리할 수 있는 다양한 기능을 제공합니다. 이를 활용하면 실행 중인 프로세스 목록 조회, 응답 없는 프로세스 강제 종료, 창 제목으로 프로세스 검색, 새 프로세스를 숨김 모드나 대화형 모드로 실행하는 등의 작업을 손쉽게 수행할 수 있습니다.

Windows 10에서 사용 가능한 프로세스 관리 Cmdlet 확인하기

Windows 10에서 사용할 수 있는 프로세스 관련 cmdlet 목록은 다음 명령어로 확인할 수 있습니다.

Get-Command –Noun Process

  • Get-Process – 실행 중인 Windows 프로세스 목록 조회
  • Start-Process – 프로세스(프로그램) 시작
  • Stop-Process – 프로세스 강제 종료(Kill)
  • Debug-Process – 프로세스 디버깅
  • Wait-Process – 프로세스가 종료될 때까지 대기

Get-Process: 실행 중인 프로세스 목록 조회하기

Get-Process cmdlet은 로컬 컴퓨터에서 실행 중인 프로세스 목록을 표시합니다. 기본적으로 다음과 같은 속성들이 출력됩니다.

  • Handles – 해당 프로세스가 연 입력·출력 파일 디스크립터(핸들)의 개수
  • NPM(K) – 비페이징 메모리(Non-paged Pool) 크기로, 디스크로 스왑되지 않는 프로세스 데이터 크기(KB)
  • PM(K) – 페이징이 가능한 프로세스 메모리 크기(KB)
  • WS(K) – 프로세스가 사용 중인 물리 메모리 크기(KB), 즉 작업 집합(Working Set)
  • CPU(s) – 프로세스가 사용한 CPU 시간(모든 CPU 코어의 사용 시간 합산)
  • ID – 고유 프로세스 식별자(PID)
  • SI(Session ID) – 프로세스 세션 ID (0은 모든 세션, 1은 첫 번째 로그온 사용자, 2는 두 번째 로그온 사용자 세션 등을 의미)
  • ProcessName – 프로세스 이름

프로세스의 전체 속성 보기

여러 프로세스의 모든 속성을 확인하려면 다음과 같이 Format-List를 사용합니다.

Get-Process cmd,excel,notep* | Format-List *

특정 속성만 선택하여 출력하기

필요한 속성만 골라서 볼 수도 있습니다. 예를 들어 프로세스 이름(ProcessName), 시작 시간(StartTime), 창 제목(MainWindowTitle), 실행 파일 경로(Path), 개발사(Company)를 함께 출력해 보겠습니다.

Get-Process winword, notep* | Select-Object ProcessName, StartTime, MainWindowTitle, Path, Company | ft

GUI가 있는 사용자 프로세스만 조회하기

백그라운드 프로세스나 시스템 프로세스를 제외하고, 창(GUI)이 있는 사용자 프로세스만 나열하려면 아래 명령을 사용합니다.

Get-Process | Where-Object {$_.mainWindowTitle} | Format-Table Id, Name, mainWindowtitle

IncludeUserName 옵션을 사용하면 해당 프로세스를 시작한 사용자(소유자) 이름도 함께 표시할 수 있습니다.

Get-Process -Name winword -IncludeUserName

조건에 맞는 프로세스 필터링하기

Where-Object를 활용하면 특정 조건에 맞는 프로세스만 선택할 수 있습니다. 예를 들어 300MB 이상의 RAM을 사용하는 프로세스를 찾아, 메모리 사용량 기준 내림차순으로 정렬하고 KB 대신 MB 단위로 표시해 보겠습니다.

Get-Process | where-object {$_.WorkingSet -GT 300000*1024} | select processname,@{l="Used RAM(MB)"; e={$_.workingset / 1mb}} | sort "Used RAM(MB)" –Descending

프로세스별 CPU 사용률(%) 계산하기

앞서 언급했듯이 Get-Process의 CPU 속성에는 각 프로세스가 사용한 누적 CPU 시간(초 단위)이 담겨 있습니다. 작업 관리자처럼 프로세스별 CPU 점유율(%)을 표시하려면 아래 함수를 사용하세요.

function Get-CPUUsagePercent
{
$CPUPercent = @{
Name = 'CPUPercent'
Expression = {
$TotalSec = (New-TimeSpan -Start $_.StartTime).TotalSeconds
[Math]::Round( ($_.CPU * 100 / $TotalSec), 2)
}
}
Get-Process | Select-Object -Property Name, $CPUPercent, Description | Sort-Object -Property CPUPercent -Descending | Select-Object -First 20
}
Get-CPUUsagePercent

응답 없는(멈춘) 프로세스 찾기

응답하지 않는 프로세스(중단된 상태)를 찾으려면 다음 명령을 실행합니다.

Get-Process | where-object {$_.Responding -eq $false}

Start-Process, Stop-Process: PowerShell로 프로세스 시작 및 종료하기

PowerShell로 새 프로세스를 시작하려면 Start-Process cmdlet을 사용합니다.

Start-Process -FilePath notepad

실행 파일이 $env:path 환경 변수에 등록되어 있지 않다면 파일의 전체 경로를 지정해야 합니다.

Start-Process -FilePath 'C:\distr\app.exe'

프로그램을 실행하면서 인수를 함께 전달할 수도 있습니다.

Start-Process -FilePath ping -ArgumentList "-n 10 10.1.56.21"

WindowStyle 옵션을 사용하면 프로세스 창의 시작 모드(normal, minimized, maximized, hidden)를 지정할 수 있습니다. 예를 들어 프로그램을 최대화된 창으로 실행하고, 프로세스가 끝날 때까지 대기하려면 다음 명령을 사용합니다.

Start-Process -FilePath tracert -ArgumentList "10.1.56.21" –wait -windowstyle Maximized

Stop-Process로 프로세스 종료하기

Stop-Process cmdlet을 사용하면 원하는 프로세스를 종료할 수 있습니다. 예를 들어 실행 중인 모든 메모장(notepad) 프로세스를 닫으려면 다음과 같이 입력합니다.

Stop-Process -Name notepad

기본적으로 프로세스를 종료할 때 확인 메시지가 표시되지 않으며, 조건에 맞는 모든 프로세스가 즉시 종료됩니다. 종료 전에 확인 절차를 거치려면 –Confirm 옵션을 추가하세요.

Stop-Process -Name notepad.exe -Confirm

또한 다음과 같은 방식으로도 프로세스를 종료할 수 있습니다.

(Get-Process -Name cmd).Kill()

PowerShell을 사용하면 작업 관리자에서 '응답 없음' 상태인 모든 애플리케이션을 한 번에 강제 종료할 수도 있습니다.

Get-Process | where-object {$_.Responding -eq $false} | Stop-Process

이 방법을 응용하면 멈추거나 종료된 프로세스를 자동으로 재시작하는 스크립트도 만들 수 있습니다.

PowerShell로 원격 컴퓨터의 프로세스 관리하기

Get-Process cmdlet의 ComputerName 옵션을 사용하면 원격 컴퓨터의 프로세스도 관리할 수 있습니다(단, WinRM이 사전에 활성화 및 구성되어 있어야 합니다).

Get-Process -ComputerName srv01, srv02, srv03 | Format-Table -Property ProcessName, ID, MachineName

여기서는 원격 컴퓨터 프로세스 관리를 위한 Get-Process의 기본 기능만 다룹니다. Invoke-Command, Enter-PSSession cmdlet에서 제공되는 PowerShell Remoting 고급 기능은 본문의 범위를 벗어납니다.

원격 컴퓨터에서 프로세스를 종료할 때는 주의가 필요합니다. Stop-Process cmdlet에는 –ComputerName 매개변수가 없기 때문입니다. 원격 컴퓨터의 프로세스를 종료하려면 다음과 같은 PowerShell 코드를 사용하세요.

$RemoteProcess = Get-Process -Name cmd -ComputerName srv01
Stop-Process -InputObject $RemoteProcess