리눅스 머신에서 특정 포트를 사용 중인 프로세스를 중단해야 하는 상황을 겪어본 적이 있으신가요?
실행 중인 애플리케이션이 오작동하거나 네트워크 자원과 CPU를 과도하게 점유하고 있다면 걱정될 수 있습니다. 심한 경우 보안 위협이 될 수 있는 프로세스를 제거해야 할 때도 있습니다.
이유가 무엇이든, 터미널에서 fuser, lsof, netstat 명령어(kill과 함께)를 사용하면 포트 번호를 기준으로 리눅스 프로세스를 찾아 종료할 수 있습니다. 이 명령어들은 우분투(Ubuntu)를 포함한 대부분의 리눅스 배포판에서 동일하게 작동합니다.
fuser 명령어로 프로세스 종료하기
포트 번호로 프로세스를 종료하는 가장 간단한 방법 중 하나는 fuser 명령어를 사용하는 것입니다. 이 명령어는 파일이나 소켓에 접근하는 프로세스를 조회하거나 종료할 수 있습니다. 네트워크 활동(즉, 열린 포트 사용)으로 실행되는 애플리케이션이라면 대부분 이 두 작업 중 하나에 해당합니다.
시작하기 전에 리눅스 터미널 사용에 어느 정도 익숙해져 있는지 확인하세요.
fuser로 특정 포트를 사용하는 프로세스를 조회하려면 다음 구문을 사용합니다:
fuser -n [프로토콜] [포트]
여기서 프로토콜은 tcp 또는 udp이며, 포트는 확인하려는 포트 번호입니다. 예를 들어 TCP 80번 포트를 사용하는 프로세스를 확인하려면 다음을 실행합니다:
fuser -n tcp 80
이 명령은 해당 포트를 사용하는 프로세스 ID(PID)를 출력합니다.
이 프로세스들을 종료하려면 -k 옵션을 추가합니다. 각 프로세스에 SIGTERM 시그널을 보내 정상적으로 종료하도록 요청합니다:
fuser -k -n tcp 80
TCP 80번 포트를 사용하는 모든 프로세스가 종료됩니다.
SIGTERM에 응답하지 않는 프로세스가 있다면 -k 대신 -KILL을 사용하세요. 이 경우 강제 종료 시그널(SIGKILL)이 전송되어 프로세스가 즉시 종료됩니다. 다만 데이터 손실이나 손상이 발생할 수 있으므로 신중하게 사용해야 합니다:
fuser -KILL -n tcp 80
TCP 80번 포트를 사용하는 모든 프로세스가 강제로 종료됩니다. 문제가 발생하면 sudo 명령어로 슈퍼 유저 권한을 얻거나 root 계정으로 실행하세요.
lsof 명령어로 프로세스 종료하기
포트 번호로 프로세스를 종료하는 또 다른 방법은 lsof 명령어입니다. 이 명령어는 시스템에서 열려 있는 파일과 소켓 목록을 조회할 수 있습니다.
특정 포트를 사용하는 프로세스를 조회하려면 다음 구문을 사용합니다:
lsof -i [프로토콜]:[포트]
예를 들어 TCP 53번 포트(주로 DNS 요청에 사용됨)를 사용하는 프로세스를 확인하려면 다음 명령을 실행합니다:
lsof -i tcp:53
이 명령은 해당 포트를 사용하는 각 프로세스의 PID를 포함한 상세 정보를 출력합니다.
이 프로세스들을 종료하려면 -t 옵션을 사용합니다. 이 옵션은 다른 정보 없이 PID만 출력하므로, 그 결과를 kill 명령어에 파이프하여 전달할 수 있습니다:
kill $(lsof -t -i tcp:53)
TCP 53번 포트를 사용하는 모든 프로세스에 SIGTERM 시그널(기본값)이 전송됩니다.
SIGTERM에 응답하지 않는 프로세스가 있다면 -9 옵션을 사용합니다. 이 경우 SIGKILL 시그널이 전송되어 즉시 종료되지만, 역시 데이터 손실 가능성이 있습니다:
kill -9 $(lsof -t -i tcp:53)
TCP 53번 포트를 사용하는 모든 프로세스에 SIGKILL 시그널이 강제로 전송됩니다.
netstat 명령어로 프로세스 종료하기
netstat 명령어를 사용하면 활성화된 네트워크 포트를 기반으로 실행 중인 프로세스를 추적할 수 있습니다. netstat는 시스템의 네트워크 연결과 통계를 조회할 수 있게 해주므로, 문제가 되는 프로세스를 정확히 찾아내는 데 유용합니다.
포트를 사용하는 프로세스와 해당 PID를 함께 조회하려면 두 가지 옵션이 필요합니다: PID를 표시하는 -p와 리스닝(listening) 소켓만 표시하는 -l입니다.
또한 프로토콜(tcp, udp 등)을 지정하고, 필요에 따라 상태(LISTEN 등)로 필터링할 수 있습니다. 예를 들어 리스닝 중인 모든 TCP 프로세스를 확인하려면 다음을 실행합니다:
netstat -p tcp -l
이 명령은 각 TCP 소켓이 리스닝 중인 포트와 PID를 포함한 정보를 출력합니다.
특정 포트로 필터링하려면 이름 대신 숫자 주소를 표시하는 -n 옵션을 추가로 사용해야 합니다. 주소 형식은 [protocol][@hostname|hostaddr][:service|port]를 따릅니다.
예를 들어 TCP 80번 포트에서 리스닝 중인 프로세스를 확인하려면 다음을 실행합니다:
netstat -p tcp -l -n 80
이 명령은 80번 포트에서 리스닝 중인 각 TCP 소켓의 PID를 포함한 정보를 출력합니다.
이 프로세스들을 종료하려면 kill 명령어에 원하는 시그널 옵션과 netstat에서 얻은 PID를 함께 사용합니다:
kill 1234 5678
PID가 1234와 5678인 프로세스에 SIGTERM 시그널(기본값)이 전송됩니다.
SIGTERM에 응답하지 않는다면 -9 옵션을 사용합니다:
kill -9 1234 5678
PID가 1234와 5678인 프로세스에 SIGKILL 시그널이 강제로 전송됩니다. 실제 환경에서는 1234를 종료하려는 프로세스의 올바른 PID로 교체하세요.
리눅스 애플리케이션 관리의 시작
위에서 소개한 방법을 활용하면 리눅스 명령줄에서 포트 번호를 기준으로 실행 중인 프로세스를 빠르게 종료할 수 있습니다. 다만 프로세스를 종료할 때는 특히 SIGKILL 시그널 사용 시 주의해야 합니다. 원치 않는 부작용이 발생할 수 있으며, 시스템 불안정을 초래할 수 있기 때문입니다.
리눅스 시스템 성능을 더 깊이 살펴보고 싶다면 메모리 사용량 확인부터 시작해 보세요. 잠재적인 보안 위험이 걱정된다면 리눅스 비밀번호 변경도 함께 고려하는 것이 좋습니다.
새로운 리눅스 배포판으로 전환을 계획 중이라면, 초보자에게는 안전하고 안정적인 Linux Mint를 추천합니다.