파워셸 시리즈의 일곱 번째 포스팅입니다. 서버 관리자나 엔지니어들이 가장 두려워하는 상황은 무엇일까요? 바로 모두가 퇴근한 새벽, 핵심 서비스가 조용히 멈춰버리는 것입니다.
매번 사람이 직접 모니터링할 수는 없습니다. 오늘은 파워셸을 이용해 **"문제가 생긴 프로그램을 자동으로 감지하고, 스스로 되살리는(Self-healing) 자동화 스크립트"**를 만들어보겠습니다. 이 기술 하나면 여러분의 주말과 퇴근 후의 삶이 훨씬 평화러워질 것입니다.
컴퓨터를 사용하다 보면 프로그램이 '응답 없음'으로 멈추거나, 잘 돌아가던 웹 서버나 프린터 서비스가 갑자기 꺼지는 일을 겪게 됩니다. 보통은 작업 관리자를 열어 강제 종료하거나 서비스를 재시작하지만, 이 작업을 수동으로 하는 것은 하수입니다.
파워셸(PowerShell)을 활용하면 특정 프로그램이 멈췄을 때 자동으로 종료시키거나, 중요한 서비스가 꺼져 있을 때 즉시 감지하여 다시 켜는 **'무인 복구 시스템'**을 아주 간단하게 구축할 수 있습니다. 오늘은 시스템 안정성을 책임지는 프로세스와 서비스 제어 기술을 다뤄보겠습니다.
1. 프로세스 제어: "응답 없는 녀석들" 자동 정리
가장 먼저 다룰 것은 실행 중인 프로그램, 즉 **프로세스(Process)**입니다. CMD에서는 tasklist, taskkill을 썼지만, 파워셸에서는 Get-Process와 Stop-Process를 사용합니다.
(1) 메모리를 많이 먹는 범인 찾기
서버가 느려졌을 때, 메모리를 가장 많이 잡아먹는 상위 5개 프로그램을 찾고 싶다면 어떻게 해야 할까요? 파이프라인 정렬 기능을 이용하면 한 줄로 해결됩니다.
# PM(PagedMemory) 기준으로 내림차순 정렬하여 상위 5개 출력
Get-Process | Sort-Object PM -Descending | Select-Object -First 5
(2) 응답 없는 메모장 강제 종료하기
특정 프로그램(예: 메모장)이 멈췄을 때, 이름을 기준으로 찾아내어 종료시키는 스크립트입니다.
# Notepad라는 이름의 모든 프로세스를 찾아 강제 종료(-Force)
Get-Process -Name Notepad -ErrorAction SilentlyContinue | Stop-Process -Force
- -ErrorAction SilentlyContinue: 만약 메모장이 실행 중이지 않다면 에러가 발생하는데, 자동화 스크립트에서 빨간 에러 메시지는 보기 좋지 않습니다. "없으면 조용히 넘어가라"는 이 옵션은 스크립트의 안정성을 위해 필수적입니다.
- -Force: 묻지도 따지지도 않고 즉시 종료시키는 옵션입니다.
2. 서비스 제어: 백그라운드 시스템의 지휘자
프로세스가 눈에 보이는 프로그램이라면, **서비스(Service)**는 윈도우 백그라운드에서 조용히 돌아가는 핵심 기능들입니다. (예: 윈도우 업데이트, 프린터 스풀러, 웹 서버 등)
서비스 제어의 핵심 명령어는 4총사입니다.
- Get-Service: 상태 확인
- Start-Service: 켜기
- Stop-Service: 끄기
- Restart-Service: 재시작
(1) 서비스 상태 확인하기
가장 많이 문제가 생기는 프린터 스풀러(Spooler) 서비스가 현재 돌고 있는지 확인해 봅시다.
$svc = Get-Service -Name Spooler
Write-Host "서비스 이름: $($svc.Name)"
Write-Host "현재 상태: $($svc.Status)"
파워셸의 장점은 $svc.Status가 단순히 'Running'이라는 텍스트가 아니라, 비교 가능한 상태 값이라는 점입니다. 이를 이용해 자동화 로직을 짭니다.
3. [실전 프로젝트] 죽은 서비스 심폐소생술(Self-healing) 스크립트
오늘의 하이라이트입니다. 특정 서비스(예: Spooler)가 꺼져 있다면, 이를 감지하고 자동으로 다시 켜주는 스크립트를 작성합니다. 이 스크립트를 작업 스케줄러에 등록해 5분마다 실행하게 하면, 관리자가 잠든 사이에도 서버는 스스로 복구됩니다.
# 감시할 서비스 이름 (여기에 원하는 서비스명을 넣으세요. 예: wuauserv, Spooler)
$targetService = "Spooler"
# 1. 서비스 상태 가져오기
try {
$svc = Get-Service -Name $targetService -ErrorAction Stop
}
catch {
Write-Warning "[$targetService] 서비스를 찾을 수 없습니다."
exit
}
# 2. 상태 점검 및 자동 복구 로직
if ($svc.Status -ne 'Running') {
# 현재 시간 기록
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Write-Host "[$timestamp] 경고: $targetService 서비스가 중지되어 있습니다." -ForegroundColor Red
Write-Host "[$timestamp] 조치: 서비스를 재시작합니다..." -ForegroundColor Yellow
# 3. 서비스 시작 시도
try {
Start-Service -Name $targetService -ErrorAction Stop
# 4. 제대로 켜졌는지 재확인 (잠시 대기)
Start-Sleep -Seconds 3
$svcCheck = Get-Service -Name $targetService
if ($svcCheck.Status -eq 'Running') {
Write-Host "[$timestamp] 성공: 서비스가 정상적으로 복구되었습니다." -ForegroundColor Green
# (선택 사항) 여기에 관리자에게 이메일이나 슬랙 알림을 보내는 코드를 추가할 수 있습니다.
}
}
catch {
Write-Host "[$timestamp] 실패: 서비스를 시작할 수 없습니다. 관리자의 개입이 필요합니다." -ForegroundColor Magenta
Write-Error $_.Exception.Message
}
}
else {
Write-Host "[$targetService] 서비스가 정상 작동 중입니다." -ForegroundColor Green
}
코드 핵심 분석 (E-E-A-T 기술 포인트)
- Status -ne 'Running': 'Not Equal(같지 않음)' 연산자를 사용해 실행 중이 아닌 모든 상태(Stopped, Paused 등)를 감지합니다.
- Try-Catch 구문: 서비스 제어는 관리자 권한이 없거나 의존성 문제로 실패할 수 있습니다. 이때 스크립트가 멈추지 않고 "실패했다"는 로그를 남기도록 예외 처리를 했습니다. 이것이 아마추어 스크립트와 전문가 스크립트의 차이입니다.
- Start-Sleep: 서비스를 켜는 명령을 내리자마자 바로 상태를 확인하면, 윈도우가 아직 켜는 중(Starting)이라서 '실패'로 오판할 수 있습니다. 3초 정도 기다려주는 여유가 필요합니다.
4. 주의사항: 반드시 '관리자 권한'으로
서비스를 켜고 끄는 작업은 운영체제의 핵심 영역을 건드리는 일입니다. 따라서 이 스크립트를 실행할 때는 반드시 **파워셸을 관리자 권한(Run as Administrator)**으로 실행해야 합니다. 만약 권한이 없다면 Start-Service 명령어에서 "액세스가 거부되었습니다"라는 빨간 에러를 보게 될 것입니다.
마치며
오늘 우리는 문제가 생긴 시스템을 스스로 진단하고 치료하는 '셀프 힐링' 스크립트를 만들어 보았습니다. 이 코드는 프린터 서버뿐만 아니라 웹 서버(IIS), 데이터베이스(SQL) 등 모든 윈도우 기반 서버 관리에 응용할 수 있는 강력한 도구입니다.
이제 서버가 멈출까 봐 노심초사하지 마세요. 파워셸에게 감시를 맡기고 여러분은 편안하게 퇴근하시면 됩니다.
다음 포스팅에서는 **"윈도우 이벤트 로그 분석: 수만 줄의 로그 속에서 보안 위험 자동 감지하기"**에 대해 알아보겠습니다. 누군가 몰래 내 PC에 접속하려다 실패한 기록을 파워셸로 쏙 뽑아내는 보안 자동화 기술을 기대해 주세요.