좀비 서비스?

Windows에서는 가끔 서비스가 올바로 시작되지 않거나 했을 때, ‘서비스 시작 중’인 상태 그대로 뻗어버리는(?) 경우가 있다.

대표적인 예가 Apache와 PHP를 연동했다 잘못됐을 때인데, 이렇게 되면 start 명령도 stop 명령도 듣지 않아 처치 곤란이다. 서비스로 실행된 프로그램은 사용자와 ‘대화’할 수 없기 때문이다.

이렇게 되는 예를 들자면, (좀 억지스럽지만) 서비스 프로그램이 에러를 ‘알림참’으로 띄운 경우를 들 수 있다. 이 경우 알림창은 사용자가 볼 수 없는 곳에 뜨므로 알림창의 ‘확인’ 버튼을 누를 수 없으므로 서비스는 시작중인 상태에서 사용자 입력을 기다리며 멈춰버린다.

taskill을 이용한 강제종료

Linux에 kill이라는 명령이 있는 것처럼, Windows에도 taskkill이라는게 있다. 이걸 이용하면 프로세스의 고유 아이디인 PID나 필터를 이용해서 이미지 이름, 사용자 이름, DLL 이름, 창 이름, 서비스 이름 등을 조건으로 검색해서 프로세스를 종료할 수 있다.

다음은 한 예다:

taskkill /FI "SERVICES eq Apache2.2" /F

위 명령은 이름이 “Apache2.2”인 “서비스”를 “죽이라”는 것으로, /FI가 필터 지정, /F가 죽이라는 옵션이다.

결과는 다음과 같다:

성공: 프로세스(PID 3408)가 종료되었습니다.

작업 관리자(taskmgr)를 이용한 강제종료

만약, 사용자가 구별할 수만 있다면 작업 관리자를 이용해도 된다. 서비스는 특별한 사용자로 실행하여 화면에 안보이는 것일 뿐, 일반 프로그램과 마찬가지로 프로세스이기 때문이다. 다만, 일반적으로는 이를 건드릴 일이 없어 표시하지 않는데, ‘모든 사용자의 프로세스 표시’라는 옵션을 켜면 서비스 프로세스도 확인할 수 있다.

작업 관리자에서 찾은 Apache

여기서 만약 Apache2.2를 죽이려고 한다면 이미지 이름에서 httpd를 찾아 죽이면 된다. 혹시 이미지 이름을 모른다면 ‘설명’을 보고 원하는 프로세스를 찾으면 된다.

무엇을 쓸까?

작업 관리자는 GUI인 만큼 쓰기 편하다는 장점이 있다. 하지만, 눈으로 하나씩 확인해 찾아야 하고, 같은 이미지가 여러개 떠있을 경우 무엇이 원하는 프로세스인지 판단할 수 없다는 문제가 있다. 죽여도 괜찮은지 확실치 않은 프로세스를 막 죽이는것은 썩 좋지 않기 때문이다.

그러니 서비스 이름처럼 찾을 수 있는 기준이 명확한것은 taskkill을 이용하는게 좋다. 특히, 특정 서비스를 종료할 일이 잦다면, 간단한 배치 명령을 만들어두면 재실행도 손쉬우므로 매번 목록을 뒤져 찾아야 하는 것 보다 더 나을 것이다.