'강제종료'에 해당되는 글 2건

  1. 2012.01.17 윈도우에서 특정 프로세스 강제 종료하는 방법 (2)
  2. 2009.09.04 실행중인 프로세스 디버깅 덤프 및 강제종료
2012.01.17 19:35

윈도우에서 특정 프로세스 강제 종료하는 방법

윈도우에서 특정 프로그램이 먹통된 경우, 일반적으로 작업 관리자를 띄워서 응용 프로그램 탭에서 작업 끝내기 버튼을 누르실 텐데, 가끔 이렇게 눌러도 먹통된 상태로 머무르는 경우가 있습니다. 물론 이럴 때 깔끔하게 재부팅 한번 해줘도 되겠지만, 명령어를 이용해서 프로세스를 종료해봅시다.

프로세스를 종료시킬 때 사용하는 명령어는 taskkill 입니다. 리눅스의 kill 명령어와 비슷하다 보시면 됩니다.

기본적으로 2가지 방식을 사용하는데

taskkill /f /im xxxx.exe
taskkill /f /pid 0000

/f 옵션은 강제로 종료하겠다는 말이고
/im 옵션은 이미지 이름을 지정하겠다는 말입니다.
/pid 옵션은 말 그대로 PID 값(숫자)을 지정하겠다는 말이구요.

이미지 이름이나 PID는 어떻게 확인할까요? 이미지 이름은 작업 관리자 프로세스 탭에 표시되지만 PID는 기본적으로 표시되지 않습니다. 하지만 표시하는 방법이 있는데...

작업 관리자 프로세스 탭에서 보기 메뉴를 누르면 열 선택이라는 항목이 나옵니다.


여기서 PID에 체크를 해주시면

아래 그림처럼 PID가 표시됩니다.


그런데 굳이 작업 관리자에서 확인하지 않더라도, 이미지 이름과 PID 값을 tasklist 명령어로 확인할 수 있습니다. 그리고 UI에서 확인할 수 없는 내용도 있기 때문에 tasklist 명령어는 익혀두시는게 좋겠습니다.


자 이제 여기서부터 막히는 부분이 생기게 됩니다. 같은 이름의 프로세스가 여러개 있는데, 어떤 녀석을 죽여야 할지 (몇번 PID를 죽여야 할지) 고민되는 경우가 있습니다. 바로 svchost.exe 에서 이런 고민을 하시게 될 것입니다. 일단 svchost.exe가 뭔지 대충 설명드리자면

svchost.exe란? 

Svchost.exe는 Windows에서 다양한 기능을 수행하는 데 사용하는 기타 개별 서비스를 호스팅하거나 포함하는 컴퓨터의 프로세스입니다. 예를 들어 Windows Defender에서는 svchost.exe 프로세스에서 호스팅하는 서비스를 사용합니다. 

인스턴스마다 서로 다른 서비스를 포함하는 여러 svchost.exe 인스턴스가 컴퓨터에서 실행 중일 수 있습니다. 한 svchost.exe 인스턴스는 프로그램의 단일 서비스를 호스팅하고 다른 인스턴스는 Windows와 관련된 여러 서비스를 호스팅할 수 있습니다. 작업 관리자를 사용하면 각각의 svchost.exe 인스턴스에서 실행 중인 서비스를 볼 수 있습니다.
출처 : http://windows.microsoft.com/ko-KR/windows-vista/What-is-svchost-exe

그러니까 한마디로 윈도우에서 서비스를 띄워주는 역할을 한다고 보시면 되는데, 많은 윈도우 서비스들이 svchost.exe 프로세스에 올라가 서비스로 동작하고 있습니다. 그런데 어떤 서비스가 어떤 PID의 svchost.exe 에 들어있는지 확인하려면 어떻게 해야 할까요?

tasklist /svc


많아서 보기 불편하시죠? 그렇다면 svchost.exe 이미지만 걸러내 볼까요?

tasklist /svc /fi "imagename eq svchost.exe"


또는 내가 찾고자 하는 서비스 이름을 알고 있다면 다른 방식으로 찾을 수도 있습니다. 예를 들어 작업 스캐줄러를 찾고 싶다면

tasklist /svc /fi "services eq schedule"


아무튼 이렇게 tasklist를 잘 활용하면 어떤 프로세스를 죽여야 하는지 쉽게 찾을 수 있습니다. 물론 윈도우 비스타 이상에서는 작업관리자에서 웬만큼 해결이 되지만, 그래도 taskkill, tasklist 명령어는 알아두시는게 좋다고 생각합니다.


출처 : snoopybox.co.kr

Trackback 0 Comment 2
  1. Favicon of http://goom.com 2012.05.30 13:13 address edit & del reply

  2. 질문요 2013.11.07 20:25 address edit & del reply

    taskkill /f /im 이 방법으로 강제종료가 되지 않는다면 어떻게 해야 하나요?

2009.09.04 18:14

실행중인 프로세스 디버깅 덤프 및 강제종료

간혹, 실행 중인 프로세스의 덤프 파일을 생성해야하는 경우가 있습니다.

보통, 비정상적으로 동작하는 프로그램이 있는데, 이를 디버깅 환경이 갖추어진 다른 시스템에서 버그를 찾아보려고 할 경우, 그 프로세스의 덤프 파일을 생성한 뒤 이를 디버깅 시스템으로 가져가기 위해 사용하곤 합니다.

실행 중인 프로세스의 덤프 파일을 생성하는 방법으로는 userdump 나 ADPlus 를 이용하는 방법 등 다양하게 있겠지만 NTSD (NT Symbolic Debugger) 를 이용하는 방법도 있습니다.

NTSD의 장점으로는 우선 XP를 비롯한 여러 윈도우에 기본으로 설치가 되어 있다는 점을 들 수 있습니다.
물론, 최신 버전을 설치한다면 추가된 기능들을 사용하는 것도 가능하겠지요.

또한 단순히 덤프 파일만 생성하는 기능을 가진 userdump 등과는 달리 원래 Debugger 이기 때문에 다양한 기능들을 활용하여 보다 입맛에 맞는 작업을 수행하는 것이 가능합니다.

다음은 가장 기본적인 형태로, 특정 프로세스의 덤프 파일을 저장하기 위한 명령어를 보여주고 있습니다.

ntsd -p %PID -c ".dump c:\process.dmp;.detach;q"

위에서 %PID 를 해당 프로세스의 PID 값으로 적어주면, 그 프로세스의 덤프가 c:\process.dmp 에 저장됩니다.

디버깅을 하다 보면, 프로세스가 살아 남아서 새로운 프로세스를 띄우는데 어려움을 겪거나 그러한 이유 때문에 다른 문제가 발생할 수 있습니다. 하지만 http://www.sysinternals.com과 같은 사이트에서 제공하는 ProcessExplorer를 이용하거나 작업관리자를 이용하면 실행중인 프로세스를 강제로 종료할 수 있습니다. 또는 ntsd(NT 커널 디버거)를 이용하여 프로세스를 강제 종료하는 방법도 있습니다.

일단 작업 관리자를 이용하여 해당 프로세스의 아이디를 얻어냅니다. 그리고 나서 ntsd -p [프로세스 ID]를 입력하여 ntsd를 해당 프로세스에 연결하여 디버깅을 시작합니다. ntsd는 프로세스에 연결한 다음 정지하게 되는데, 이 때 q를 입력하여 디버깅 작업을 중단하면, 실행되고 있던 프로세스도 함께 중지되어 버립니다. 대단하죠?

그런데 이 방법에도 문제가 있다고 하는군요. 예를 들어 해당 서비스가 loader lock에서 교착 상태(deadlock)에 있는 경우에는 해당 프로세스에 디버거를 연결할 수 없고, 이 때 q를 입력하더라도 디버거만 종료된다고 합니다. 따라서 이런 경우에는 ntsd를 이용하여 프로세스를 종료할 수 없게 됩니다.

이러한 문제를 해결해야 하는 경우가 있고, 또한 시스템 프로세스의 우선 순위등을 조절해야 하는 경우가 있을 수 있습니다. 예를 들어, msdtc와 같은 서비스가 CPU를 100%사용하고 있다면, 이 서비스를 죽이지 않고 우선순위를 낮추는 방법으로 문제를 해결할 수 있습니다.(이렇게 하는 이유는 해당 서비스를 죽이지 않고, 작업을 마칠 수 있도록 하기 위함입니다. 물론 그러면서 컴퓨터는 계속해서 사용할 수 있어야겠죠). 우선 순위를 조절하는 기능은 이미 작업관리자에 포함되어 있는데, 만약 여러분이 System으로 되어있는 서비스를 선택하여 마우스 오른쪽 버튼을 클릭하여 우선 순위를 바꾸려고 하면, 아마도 권한이 없기 때문에 작업을 완료할 수 없다는 오류 메시지를 받게 될 것입니다. 왜냐하면 msdtc는 NETWORK SERVICE로 실행되고 이 권한 때문에 접근할 수 없기 때문입니다.

그런 경우에는 해당 프로세스를 제어하는 프로그램이 SeDebugPrivilege 권한을 소유하고 있어야 하는데, 작업 관리자는 기본적으로 이 권한을 소유하고 있지 않습니다. 하지만 ntsd가 이 권한을 가지고 있고 ntsd로 디버깅된 프로그램(디버기)는 이 토큰을 상속받게 되어 작업 관리자도 똑같이 SeDebugPrivilege를 갖게 되는 것입니다. 이를 위해 다음과 같이 실행하면 됩니다.

ntsd taskmgr

이 상태로도 System 서비스의 우선 순위를 마음대로 바꿀 수 있지만,계속해서 ntsd가 실행된 상태이기 때문에 qd 명령을 입력하여 taskmgr은 실행 상태로 남겨둔채, ntsd만 종료하도록 연결을 해제할 수 있습니다. 이 작업은 다음과 같이 작동되게 할 수 있습니다.

ntsd -hd -c "qd" taskmgr

여기에서 -hd는 일반 힙(디버거에서 실행되는 디버기는 기본적으로 NT 디버그 힙을 사용하게 되는데, 이 힙은 느릴 뿐만 아니라 용량도 많이 차지한다)을 사용하도록 하기 위함이며, -c 옵션은 다음에 오는 명령을 첫번째 breakpoint에서 실행시키기 위함입니다. 만약 이 파일을 배치파일로 만들면 항상 무적인 작업 관리자를 만들 수 있는 것이죠.

여기서 이상한 일은 기본적으로 작업 관리자가 다른 프로세스를 종료하기 위해서 일시적으로 SeDebugPrivilege 권한을 획득하게 되는데, 시스템의 우선 순위를 바꿀 때에는 이 권한을 획득하지 않는다는 점입니다.


출처 : http://lwittgen.tistory.com/

Trackback 0 Comment 0