포트 번호로 Linux 프로세스를 종료하는 방법
게시 됨: 2022-10-08Linux 프로세스를 종료하려면 해당 ID 또는 이름이 필요합니다. 사용 중인 포트만 알고 있다면 여전히 종료할 수 있습니까? 예, 여러 가지 방법으로.
킬링 프로세스
때때로 Linux 프로세스가 응답하지 않을 수 있습니다. 올바르게 작동하지 않거나 계속 작동하지만 종료 요청을 무시하거나 메모리, CPU 또는 네트워크 대역폭을 소모하기 시작할 수 있습니다.
동기가 무엇이든 Linux 명령줄에서 프로세스를 종료하는 방법이 있습니다. 고전적인 방법은 종료하려는 프로세스의 프로세스 ID와 함께 kill 명령을 사용하는 것입니다. kill
명령에는 가까운 친척이 있습니다. pkill
명령은 이름으로 프로세스를 종료하고 killall
은 이름의 일부를 공유하는 것을 찾을 수 있는 모든 프로세스를 종료합니다.
프로세스에 대해 알고 있는 것이 컴퓨터의 포트를 사용하고 있다는 것뿐이라면 여전히 프로세스를 식별하고 종료하는 방법이 있습니다. 네트워킹 용어에서 "포트"는 CAT5 또는 6 네트워크 리드와 같이 끝에 플러그가 있는 케이블을 삽입하는 물리적 연결을 의미하거나 소프트웨어 포트를 의미할 수 있습니다.
소프트웨어 포트는 네트워크 연결의 마지막 부분입니다. 장치의 IP 주소는 컴퓨터 또는 기타 네트워크 기기를 식별합니다. 컴퓨터 내부의 응용 프로그램은 다른 포트를 사용합니다. 이는 또 다른 수준의 세분성을 제공합니다. 네트워크 트래픽은 IP 주소를 사용하여 올바른 컴퓨터에 도달했으며 포트 주소 지정을 사용하여 올바른 응용 프로그램에 전달할 수 있습니다.
마치 호텔에 도착한 우편물이 분류되어 적절한 방으로 배달되는 것과 같습니다. IP 주소는 호텔의 번지와 같고 객실 번호는 포트 번호와 같습니다.
포트에서 네트워크 활동을 보고 이를 생성하는 프로세스를 인식하지 못하거나 해당 동작이 문제가 있거나 의심스러운 경우 프로세스를 종료할 수 있습니다. 포트 번호만 알고 있어도 프로세스를 추적하여 종료할 수 있습니다.
socat으로 연결 만들기
죽일 연결이 있으므로 socat
을 사용하여 다른 프로토콜을 사용하는 네트워크 연결을 만듭니다. socat
을 설치해야 합니다. Ubuntu에 설치하려면 다음 명령을 사용하십시오.
sudo apt 설치 socat
Fedora에서 dnf
를 사용하십시오.
sudo dnf 설치 socat
Manjaro에서는 다음을 입력해야 합니다.
sudo pacman -S socat
socat
의 구문은 조금 길다면 간단합니다. 소스 및 대상 주소를 제공해야 합니다. 이들 각각에 대해 프로토콜, IP 주소 및 포트 번호를 제공해야 합니다. STDIN 또는 STDOUT을 소스 또는 대상으로 대체할 수 있습니다.
이 명령은 127.0.0.1의 루프백 IP 주소에 있는 포트 7889의 TCP 수신 소켓과 STDOUT 간의 연결을 만듭니다. 앰퍼샌드 " &
"는 백그라운드에서 명령을 실행하므로 명령줄에 계속 액세스할 수 있습니다.
socat tcp-listen:7889,bind=127.0.0.1 stdout &
서로 다른 프로토콜을 사용하는 소수의 소켓을 선택할 수 있도록 두 개의 연결을 더 만들 것입니다. UDP 연결과 SCTP 연결을 생성하겠습니다. 변경되는 명령의 유일한 부분은 프로토콜입니다.
socat udp-listen:7889,bind=127.0.0.1 stdout &
socat sctp-listen:9999,bind=127.0.0.1 stdout &
관련: TCP와 UDP의 차이점은 무엇입니까?
죽이기 사용하기
물론 프로세스의 ID가 무엇인지 아는 한 kill
을 사용하여 프로세스를 종료할 수 있습니다. PID를 찾으려면 lsof
명령을 사용할 수 있습니다.
TCP 프로토콜을 사용하는 포트 7889에서 프로세스의 세부 정보를 나열하려면 다음과 같이 -i
(인터넷 주소) 옵션을 사용합니다.
lsof -i tcp:7889
이 프로세스의 PID는 3141이며 kill
과 함께 사용할 수 있습니다.
sudo kill 3141
파이프를 사용하면 노력을 절약할 수 있습니다. lsof
의 출력을 awk
로 파이프하고 awk
에게 우리가 관심 있는 포트(7889)가 포함된 행을 검색하도록 지시하고 해당 행에서 두 번째 필드를 인쇄하면 PID를 분리합니다.
lsof -i tcp:7889 | awk '/7889/{인쇄 $2}'
그런 다음 xargs
를 사용하여 awk
의 출력을 kill
명령으로 파이프할 수 있습니다. xargs
명령은 파이프된 입력을 가져와 다른 명령에 명령줄 매개변수로 전달합니다. kill
명령과 함께 xargs
를 사용합니다.
lsof -i tcp:7889 | awk '/7889/{인쇄 $2}' | xargs 죽이다
시각적 피드백은 받지 않습니다. 일반적인 Linux 방식에서는 소식이 없는 것이 좋은 소식입니다. 프로세스가 종료되었는지 확인하려면 lsof
를 한 번 더 사용할 수 있습니다.
lsof -i tcp:7889
lsof
는 아무 것도 보고하지 않기 때문에 그러한 연결이 없다는 것을 알고 있습니다.
이전 명령에서 "tcp"를 "udp"로 바꾸면 UDP 프로토콜을 사용하는 프로세스를 제거할 수 있습니다.
lsof -i udp:7889 | awk '/7889/{인쇄 $2}' | xargs 죽이다
그러나 lsof
는 SCTP 프로토콜을 인식하지 못합니다.
lsof -i sctp:7889
ss
명령을 사용하여 이를 수행할 수 있습니다. -S
(SCTP) 옵션을 사용하여 SCTP 소켓을 검색하고 -a
(all) 옵션을 사용하여 모든 유형의 소켓(청취, 수락, 연결 등)을 검색하고 -p
(프로세스) 옵션을 사용합니다. 소켓을 사용하는 프로세스의 세부 정보를 나열합니다.
ss - 수액
grep
및 awk
를 사용하여 해당 출력을 구문 분석할 수 있습니다. grep
및 일부 PERL 정규식을 사용하여 구문 분석할 수도 있지만 이 방법이 훨씬 이해하기 쉽습니다. 이것을 두 번 이상 사용하려는 경우 별칭이나 쉘 기능을 만들 수 있습니다.
ss
의 출력을 grep
으로 파이프하고 포트 번호 7889를 검색합니다. grep
의 출력을 awk
로 파이프합니다. awk
에서 -F
(구분자 문자열) 옵션을 사용하여 쉼표 " ,
"를 필드 구분 기호로 설정합니다. "pid=" 를 포함 하는 문자열을 검색하고 해당 문자열에서 쉼표로 구분된 두 번째 필드를 인쇄합니다.
SS-Sap | grep "7889" | awk -F',' '/pid=/{인쇄 $2}'
그것은 우리에게 "pid=2859"라는 문자열을 주었습니다.
이를 다시 awk
로 파이프하고 필드 구분 기호를 등호 " =
"로 설정하고 해당 문자열에서 두 번째 필드를 인쇄할 수 있습니다. 이 필드는 등호 뒤에 있는 텍스트가 됩니다.
SS-Sap | grep "7889" | awk -F',' '/pid=/{인쇄 $2}' | awk -F'=' '{$2 인쇄}'
이제 프로세스 ID를 분리했습니다. xargs
를 사용하여 PID를 명령줄 매개변수로 kill
위해 전달할 수 있습니다.
SS-Sap | grep "7889" | awk -F',' '/pid=/{인쇄 $2}' | awk -F'=' '{$2 인쇄}' | xargs 죽이다
그러면 포트 7889에서 SCTP 프로토콜 소켓을 사용하던 프로세스가 종료됩니다.
퓨저 명령
fuser
명령은 작업을 크게 단순화합니다. 단점은 TCP 및 UDP 소켓에서만 작동한다는 것입니다. 플러스 측면에서, 그것들은 당신이 다루어야 할 가장 일반적인 두 가지 유형의 소켓입니다. fuser
명령은 우리가 확인한 Ubuntu, Fedora 및 Manjaro 컴퓨터에 이미 설치되어 있습니다.
-k
(kill) 옵션을 사용하고 포트와 프로토콜을 제공하기만 하면 됩니다. -n
(네임스페이스) 옵션을 사용하고 프로토콜과 포트를 제공하거나 "슬래시 바로 가기 형식"을 사용하고 포트 번호를 먼저 입력할 수 있습니다.
퓨저 -n TCP 7889
퓨저 7889/udp
종료된 프로세스의 포트 번호, 프로토콜, PID가 터미널 창에 출력됩니다.
먼저 퓨저를 사용해보십시오
아마도 작업 중인 컴퓨터에 설치될 것이고 프로토콜은 TCP 또는 UDP일 가능성이 높으므로 가장 간단한 방법이 적합할 가능성이 큽니다.