Windows 서비스가 "중지 중(Stopping)" 또는 "시작 중(Starting)" 상태에서 멈춰 있을 때 해당 프로세스를 수동으로 강제 종료하는 방법을 알아보겠습니다. 대부분의 Windows 관리자는 서비스를 시작, 중지 또는 재시작하려 할 때 중지 중(또는 시작 중) 상태에 멈춰버리는 문제를 겪어본 적이 있을 것입니다. 서비스 관리 콘솔(services.msc)에서는 해당 서비스의 모든 제어 버튼이 비활성화(회색으로 표시)되기 때문에 서비스를 정상적으로 중지할 수 없습니다. 가장 간단한 해결 방법은 Windows를 재시작하는 것이지만, 운영 환경에서는 항상 가능한 것은 아닙니다. 이번 글에서는 시스템을 재부팅하지 않고 멈춘 Windows 서비스나 프로세스를 강제로 종료할 수 있는 다양한 방법을 살펴보겠습니다.
서비스 중지 시 타임아웃 오류
서비스 중지를 시도한 후 30초 이내에 중지되지 않으면 Windows는 다음과 같은 오류 메시지를 표시합니다:
Windows Could not stop the xxxxxx service on Local Computer Error 1053: The service did not respond in a timely fashion.
서비스 제어 관리자(Service Control Manager)가 서비스의 시작 또는 중지를 기다리는 타임아웃은 ServicesPipeTimeout 레지스트리 매개변수를 통해 변경할 수 있습니다. 지정된 타임아웃 내에 서비스가 시작되지 않으면 Windows는 이벤트 뷰어에 오류를 기록합니다(이벤트 ID: 7000, 7009, 7011, a timeout was reached 30000 milliseconds). 예를 들어 이 타임아웃을 60초로 늘리려면 다음 명령을 사용합니다:
reg add HKLM\SYSTEM\CurrentControlSet\Control /v ServicesPipeTimeout /t REG_SZ /d 600000 /f
이 설정은 모든 프로세스를 정상적으로 종료하고 파일을 닫을 충분한 시간이 필요한 무거운 서비스(예: MS SQL Server)를 시작하거나 중지할 때 특히 유용합니다.
명령 프롬프트에서 net stop wuauserv와 같이 서비스를 중지하려고 하면 다음과 같은 메시지가 나타납니다:
The service is starting or stopping. Please try again later.
또는:
Windows could not stop the Service on Local Computer. [SC] ControlService Error 1061: The service cannot accept control messages at this time.
TaskKill을 사용하여 멈춘 Windows 서비스 강제 종료하기
멈춘 서비스를 중지하는 가장 쉬운 방법은 Windows에 내장된 taskkill 명령줄 도구를 사용하는 것입니다. 먼저 서비스의 PID(프로세스 식별자)를 찾아야 합니다. 예시로 Windows Update 서비스를 살펴보겠습니다. 이 서비스의 시스템 이름은 wuauserv입니다(services.msc 콘솔의 서비스 속성에서 이름을 확인할 수 있습니다).
특히 Windows Server 2012 R2 및 2016에서 업데이트를 설치한 후 서버를 재시작할 때 Windows Modules Installer 서비스가 멈추는 경우가 매우 흔합니다.
주의: Windows의 중요한 서비스를 강제 종료하면 BSOD(블루스크린)나 예기치 않은 시스템 재시작이 발생할 수 있으므로 신중하게 진행해야 합니다.
관리자 권한 명령 프롬프트에서 다음 명령을 실행합니다(관리자 권한이 없으면 액세스 거부 오류가 발생합니다):sc queryex wuauserv
이 예시에서 wuauserv 서비스의 PID는 9186입니다.
PID 9186인 멈춘 프로세스를 강제 종료하려면 다음 명령을 실행합니다:
taskkill /PID 9168 /F
SUCCESS: The process with PID 9168 has been terminated.
이 명령은 서비스 프로세스를 강제로 종료합니다. 이후 sc start servicename 명령이나 서비스 관리 콘솔을 통해 서비스를 다시 시작할 수 있습니다.
PID를 수동으로 확인하지 않고 더 간편하게 멈춘 서비스를 중지할 수도 있습니다. taskkill 도구에는 필요한 서비스나 프로세스를 필터로 선택할 수 있는 /FI 옵션이 있습니다. 다음 명령으로 특정 서비스를 종료할 수 있습니다:
taskkill /F /FI "SERVICES eq wuauserv"
또는 서비스 이름 없이 '응답 없음' 상태의 모든 서비스를 한 번에 종료할 수도 있습니다:
taskkill /F /FI "status eq not responding"
이후 '중지 중' 상태에 멈춰 있던 서비스가 정상적으로 중지됩니다.
taskkill 유틸리티를 사용하면 원격 컴퓨터에서 멈춘 서비스를 강제 중지할 수도 있습니다:
taskkill /S mun-fs01 /F /FI "SERVICES eq wuauserv"
PowerShell로 멈춘 Windows 서비스 강제 중지하기
PowerShell을 사용해서도 멈춘 서비스를 강제로 중지할 수 있습니다. 다음 명령을 사용하면 '중지 중(stop pending)' 상태인 서비스 목록을 확인할 수 있습니다:
Get-WmiObject -Class win32_service | Where-Object {$_.state -eq 'stop pending'}
'시작 중(start pending)' 상태인 서비스를 확인하려면:
Get-WmiObject -Class win32_service | Where-Object {$_.state -eq 'start pending'}
Stop-Process cmdlet을 사용하면 찾은 모든 서비스의 프로세스를 종료할 수 있습니다. 다음 PowerShell 스크립트는 Windows에서 멈춘 모든 서비스 프로세스를 자동으로 종료합니다:
$Services = Get-WmiObject -Class win32_service -Filter "state = 'stop pending'"
if ($Services) {
foreach ($service in $Services) {
try {
Stop-Process -Id $service.processid -Force -PassThru -ErrorAction Stop
}
catch {
Write-Warning -Message "Error. Error details: $_.Exception.Message"
}
}
}
else {
Write-Output "No services with 'Stopping'.status"
}
새로운 PowerShell Core 6.x/7.x 환경에서는 Get-WmiObject cmdlet 대신 Get-CimInstance를 사용해야 합니다. 스크립트의 첫 번째 명령을 다음과 같이 변경하세요:
$Services = Get-CimInstance -Class win32_service | where-Object state -eq 'stop pending'
ResMon으로 멈춘 서비스의 대기 체인 분석하기
resmon.exe(리소스 모니터)를 사용하면 서비스가 멈추게 만든 원인 프로세스를 찾을 수 있습니다.
- 리소스 모니터 창에서 CPU 탭으로 이동하여 멈춘 서비스 프로세스를 찾습니다;
- 해당 프로세스를 마우스 오른쪽 버튼으로 클릭하고 컨텍스트 메뉴에서 대기 체인 분석(Analyze Wait Chain) 항목을 선택합니다;
- 새 창에서 해당 프로세스가 다른 프로세스를 기다리고 있는 것을 확인할 수 있습니다. 원인이 되는 프로세스를 종료하면 됩니다. 만약 svchost.exe나 다른 시스템 프로세스를 기다리고 있다면 시스템 프로세스를 종료해서는 안 되며, 대신 해당 프로세스의 대기 체인을 추가로 분석하세요. svchost.exe가 기다리고 있는 프로세스의 PID를 찾아 그 프로세스를 종료하면 됩니다.
Process Explorer로 멈춘 서비스 종료하기
SYSTEM 계정으로 실행되는 일부 프로세스는 로컬 관리자 권한으로도 종료할 수 없습니다. 관리자 계정에 해당 프로세스나 서비스에 대한 권한이 없기 때문입니다. 이러한 프로세스(서비스)를 중지하려면 로컬 Administrators 그룹에 서비스(프로세스) 권한을 부여한 후 종료해야 합니다. 이를 위해 두 가지 도구가 필요합니다: psexec.exe와 Process Explorer(Microsoft 공식 웹사이트에서 다운로드 가능).
- 시스템(SYSTEM) 권한으로 Process Explorer를 시작하려면 다음 명령을 사용합니다:
PSExec -s -i ProcExp.exe - Process Explorer의 프로세스 목록에서 멈춘 서비스 프로세스를 찾아 속성 창을 엽니다;
- Services 탭으로 이동하여 해당 서비스를 찾고 Permissions 버튼을 클릭합니다;
- 서비스 권한 설정에서 Administrators 그룹에 모든 권한(Full Control)을 부여하고 변경 사항을 저장합니다;
- 이제 서비스 프로세스를 중지할 수 있습니다. 단, 서비스에 부여된 권한은 서비스가 재시작될 때까지 일시적으로 유지된다는 점에 유의하세요. 서비스에 영구적인 권한을 부여하려면 'Set permissions on a Windows service' 관련 문서를 참조하시기 바랍니다.