-->

 

[Linux / Windows] 특정포트를 사용하는 프로세스 강제종료

리눅스 작업을 해보면 참 사용할 일이 많은 일이다.

그런데 만약 windows에서 발생한다면? 이것도 linux에서 하는 것과 크게 다르진 않는데 생소할 수 있으니 한번 작업해보려고 한다.

 

1. netstat

터미널을 하나 열어서 작업할 건데 명령 프롬프트든, 파워쉘이든 본인이 원하는 터미널로 작업하면 된다.

linux나 windows나 netstat 명령어는 기본적으로 가지고 있다. (네트워크 세팅이 되어있다면)

$ netstat --help

프로토콜 통계와 현재 TCP/IP 네트워크 연결을 표시합니다.

NETSTAT [-a] [-b] [-e] [-f] [-n] [-o] [-p proto] [-r] [-s] [-t] [-x] [-y] [interval]

  -a            모든 연결 및 수신 대기 포트를 표시합니다.
  -b            각 연결 또는 수신 대기 포트 생성과 관련된 실행 파일을
                표시합니다. 잘 알려진 실행 파일이 여러 독립 구성 요소를
                호스팅할 경우 연결 또는 수신 대기 포트 생성과 관련된
                구성 요소의 시퀀스가 표시됩니다.
                이러한 경우에는 실행 파일 이름이 아래 [] 안에
                표시되고 위에는 TCP/IP에 도달할 때까지
                호출된 구성 요소가 표시됩니다. 이 옵션은 시간이
                오래 걸릴 수 있으며 사용 권한이 없으면
                실패합니다.
  -e            이더넷 통계를 표시합니다. 이 옵션은 -s 옵션과 함께 사용할 수
                있습니다.
  -f            외부 주소의 FQDN(정규화된 도메인 이름)을
 표시합니다.
  -n            주소 및 포트 번호를 숫자 형식으로 표시합니다.
  -o            각 연결의 소유자 프로세스 ID를 표시합니다.
  -p proto      proto로 지정한 프로토콜의 연결을 표시합니다. proto는
                TCP, UDP, TCPv6 또는 UDPv6 중 하나입니다. -s 옵션과 함께
                사용하여 프로토콜별 통계를 표시할 경우 proto는 IP, IPv6, ICMP,
                ICMPv6, TCP, TCPv6, UDP 또는 UDPv6 중 하나입니다.
  -q            모든 연결, 수신 대기 포트 및 바인딩된 비수신 대기 TCP
                포트를 표시합니다. 바인딩된 비수신 대기 포트는 활성 연결과 연결되거나
                연결되지 않을 수도 있습니다.
  -r            라우팅 테이블을 표시합니다.
  -s            프로토콜별 통계를 표시합니다. 기본적으로 IP, IPv6, ICMP,
                ICMPv6, TCP, TCPv6, UDP 및 UDPv6에 대한 통계를 표시합니다.
                -p 옵션을 사용하여 기본값의 일부 집합에 대한 통계만 지정할 수 있습니다.
  -t            현재 연결 오프로드 상태를 표시합니다.
  -x            NetworkDirect 연결, 수신기 및 공유 끝점을
                표시합니다.
  -y            모든 연결에 대한 TCP 연결 템플릿을 표시합니다.
                다른 옵션과 함께 사용할 수 없습니다.
  interval      다음 화면으로 이동하기 전에 지정한 시간(초) 동안 선택한 통계를 다시 표시합니다.
                통계 다시 표시를 중지하려면 <Ctrl+C>를 누르세요.
                이 값을 생략하면 현재 구성 정보가
                한 번만 출력됩니다.

우리는 pid를 알야 내야 하기 때문에 여기서 -a, -n, -o 옵션을 사용할 것이다.

 

2. netstat -ano

$ netstat -ano

활성 연결

  프로토콜  로컬 주소              외부 주소              상태            PID
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       4
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       1304
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING       4
  TCP    0.0.0.0:623            0.0.0.0:0              LISTENING       5492
  TCP    0.0.0.0:2701           0.0.0.0:0              LISTENING       5124
  .....

모든 연결들 중에서 외부 주소 및 포트를 도메인이 아닌 숫자 형태로 PID와 함께 출력하라는 명령어이다.

이때 status가 LISTENING인 연결만 주의 깊게 보면 된다.

 

3. grep, findstr

$ netstat -ano | grep LISTENING | grep 8080
  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       11100
  TCP    [::]:8080              [::]:0                 LISTENING       11100

git bash를 사용하거나 linux라면 grep 명령어를 통해 원하는 출력 형태의 문자열을 잡아낼 수 있다.

 

PS C:\Users\minggu92> netstat -ano | findstr "LISTENING" | findstr 8080
  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       11100
  TCP    [::]:8080              [::]:0                 LISTENING       11100

windows라면 findstr 명령어와 큰따옴표를 이용해서 잡아내야 한다.

 

4. kill, taskkill

Linux에서 프로세스를 강제 종료하려면 아주 간단한 명령어들이 있다.

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGEMT       8) SIGFPE       9) SIGKILL     10) SIGBUS
11) SIGSEGV     12) SIGSYS      13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGURG      17) SIGSTOP     18) SIGTSTP     19) SIGCONT     20) SIGCHLD
21) SIGTTIN     22) SIGTTOU     23) SIGIO       24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGPWR      30) SIGUSR1
31) SIGUSR2     32) SIGRTMIN    33) SIGRTMIN+1  34) SIGRTMIN+2  35) SIGRTMIN+3
36) SIGRTMIN+4  37) SIGRTMIN+5  38) SIGRTMIN+6  39) SIGRTMIN+7  40) SIGRTMIN+8
41) SIGRTMIN+9  42) SIGRTMIN+10 43) SIGRTMIN+11 44) SIGRTMIN+12 45) SIGRTMIN+13
46) SIGRTMIN+14 47) SIGRTMIN+15 48) SIGRTMIN+16 49) SIGRTMAX-15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4
61) SIGRTMAX-3  62) SIGRTMAX-2  63) SIGRTMAX-1  64) SIGRTMAX

기본적으로 -9 sigkill과 -15 terminate를 이용하는데 무슨 차이가 있는지는 리눅스 공부를 해보도록!

$ kill -9 11100

 

윈도에서는 taskkill 명령어를 사용한다.

PS C:\Users\minggu92> taskkill /?

TASKKILL [/S 시스템 [/U 사용자 이름 [/P [암호]]]]
         { [/FI 필터] [/PID 프로세스 id | /IM 이미지 이름] } [/T] [/F]

설명:
    이 도구는 프로세스 ID(PID) 또는 이미지 이름으로 작업을 종료하는 데
    사용합니다.

매개 변수 목록:
    /S    시스템           연결할 원격 시스템을 지정합니다.
    /U    [도메인\]사용자  명령을 실행해야 하는 사용자 컨텍스트를
                           지정합니다.
    /P    [암호]           해당 사용자 컨텍스트의 암호를 지정합니다.
                           생략한 경우에는 물어봅니다.
    /FI   필터             작업 집합을 선택하는 필터를 적용합니다.
                           "*"를 사용할 수 있습니다. 예: imagename eq acme*
    /PID  프로세스_ID      종료할 프로세스의 PID를 지정합니다.
                           TaskList를 사용하여 PID를 얻을 수 있습니다.
    /IM   이미지 이름      종료할 프로세스의 이미지 이름을
                           지정합니다. 와일드카드 문자 '*'를 사용하여
                           모든 작업 또는 이미지 이름을 지정할 수 있습니다.
    /T                     지정된 프로세스와 그 프로세스로부터 시작된
                           모든 자식 프로세스를 종료합니다.
    /F                     프로세스를 강제로 종료하도록 지정합니다.
    /?                     이 도움말 메시지를 표시합니다.
필터:
    필터 이름     유효한 연산자             유효한 값
    -----------   ---------------           -------------------------
    STATUS        eq, ne                    RUNNING |
                                            NOT RESPONDING | UNKNOWN
    IMAGENAME     eq, ne                    이미지 이름
    PID           eq, ne, gt, lt, ge, le    PID 값
    SESSION       eq, ne, gt, lt, ge, le    세션 번호.
    CPUTIME       eq, ne, gt, lt, ge, le    CPU 시간 형식
                                            hh:mm:ss
                                            hh - 시간,
                                            mm - 분, ss - 초
    MEMUSAGE      eq, ne, gt, lt, ge, le    메모리 사용(KB)
    USERNAME      eq, ne                    사용자 이름([domain\]user
                                            형식)
    MODULES       eq, ne                    DLL 이름
    SERVICES      eq, ne                    서비스 이름
    WINDOWTITLE   eq, ne                    창 제목

    참고
    ----
    1) /IM 스위치에 대한 와일드카드 문자 '*'는 필터가 적용될 때만
    사용할 수 있습니다.
    2) 원격 프로세스는 항상 강제적으로(/F) 종료될 수 있습니다.
    3) 원격 컴퓨터가 지정되면 "WINDOWTITLE"  및 "STATUS" 필터는
       지원되지 않습니다.

예:
    TASKKILL /IM notepad.exe
    TASKKILL /PID 1230 /PID 1241 /PID 1253 /T
    TASKKILL /F /IM cmd.exe /T
    TASKKILL /F /FI "PID ge 1000" /FI "WINDOWTITLE ne untitle*"
    TASKKILL /F /FI "USERNAME eq NT AUTHORITY\SYSTEM" /IM notepad.exe
    TASKKILL /S 시스템 /U domain\username /FI "USERNAME ne NT*" /IM *
    TASKKILL /S 시스템 /U 사용자 이름 /P 암호 /FI "IMAGENAME eq note*"

 

PS C:\Users\minggu92> taskkill /pid 11100
오류: 프로세스(PID 11100)를 종료할 수 없습니다.
원인: 이 프로세스는 /F 옵션을 사용하여 강제로 종료해야 합니다.
PS C:\Users\minggu92> taskkill /pid 11100 /f
오류: 프로세스(PID 11100)를 종료할 수 없습니다.
원인: 액세스가 거부되었습니다.

--관리자모드로 실행시
PS C:\Windows\system32> taskkill /pid 11100 /f
성공: 프로세스(PID 11100)가 종료되었습니다.

ㅂㄷ 터미널은 꼭 관리자 모드로 실행하자.

 

혹은 작업 관리자에서 죽일 수도 있다.

 

+ Recent posts