[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)가 종료되었습니다.
ㅂㄷ 터미널은 꼭 관리자 모드로 실행하자.
혹은 작업 관리자에서 죽일 수도 있다.
'Server & Infra' 카테고리의 다른 글
[Kafka] Kafka 구성요소 (2) | 2024.02.14 |
---|---|
[Kafka] 설치 및 환경구축 (0) | 2024.01.30 |
[Linux] WSL2를 이용한 윈도우에 리눅스 설치 (0) | 2022.08.24 |
[Jenkins] Wildfly 배포자동화 (maven) (0) | 2022.04.07 |
[Jenkins] Slack으로 Jenkins 알림받기 (0) | 2022.04.06 |