카테고리 없음

윈도우 서비스(Service)와 프로세스 제어 자동화: 죽은 서버를 스스로 되살리는 '셀프 힐링' 기술

스워플 2026. 2. 9. 04:04

파워셸 시리즈의 일곱 번째 포스팅입니다. 서버 관리자나 엔지니어들이 가장 두려워하는 상황은 무엇일까요? 바로 모두가 퇴근한 새벽, 핵심 서비스가 조용히 멈춰버리는 것입니다.

매번 사람이 직접 모니터링할 수는 없습니다. 오늘은 파워셸을 이용해 **"문제가 생긴 프로그램을 자동으로 감지하고, 스스로 되살리는(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 기술 포인트)

  1. Status -ne 'Running': 'Not Equal(같지 않음)' 연산자를 사용해 실행 중이 아닌 모든 상태(Stopped, Paused 등)를 감지합니다.
  2. Try-Catch 구문: 서비스 제어는 관리자 권한이 없거나 의존성 문제로 실패할 수 있습니다. 이때 스크립트가 멈추지 않고 "실패했다"는 로그를 남기도록 예외 처리를 했습니다. 이것이 아마추어 스크립트와 전문가 스크립트의 차이입니다.
  3. Start-Sleep: 서비스를 켜는 명령을 내리자마자 바로 상태를 확인하면, 윈도우가 아직 켜는 중(Starting)이라서 '실패'로 오판할 수 있습니다. 3초 정도 기다려주는 여유가 필요합니다.

4. 주의사항: 반드시 '관리자 권한'으로

서비스를 켜고 끄는 작업은 운영체제의 핵심 영역을 건드리는 일입니다. 따라서 이 스크립트를 실행할 때는 반드시 **파워셸을 관리자 권한(Run as Administrator)**으로 실행해야 합니다. 만약 권한이 없다면 Start-Service 명령어에서 "액세스가 거부되었습니다"라는 빨간 에러를 보게 될 것입니다.

마치며

오늘 우리는 문제가 생긴 시스템을 스스로 진단하고 치료하는 '셀프 힐링' 스크립트를 만들어 보았습니다. 이 코드는 프린터 서버뿐만 아니라 웹 서버(IIS), 데이터베이스(SQL) 등 모든 윈도우 기반 서버 관리에 응용할 수 있는 강력한 도구입니다.

이제 서버가 멈출까 봐 노심초사하지 마세요. 파워셸에게 감시를 맡기고 여러분은 편안하게 퇴근하시면 됩니다.

다음 포스팅에서는 **"윈도우 이벤트 로그 분석: 수만 줄의 로그 속에서 보안 위험 자동 감지하기"**에 대해 알아보겠습니다. 누군가 몰래 내 PC에 접속하려다 실패한 기록을 파워셸로 쏙 뽑아내는 보안 자동화 기술을 기대해 주세요.