Ubuntu 22.04에서 특정 포트를 사용 중인 프로세스를 확인하는 방법

안녕하세요. 지구 IDC 기술팀입니다.

Ubuntu 22.04 서버에서 웹 서버나 애플리케이션을 시작할 때 Address already in use와 같은 오류가 발생하면, 먼저 해당 포트를 어떤 프로세스가 사용하고 있는지 확인해야 합니다. 포트 충돌은 이미 실행 중인 서비스, 중복 실행된 애플리케이션, 잘못된 포트 설정 등으로 발생할 수 있습니다.

이 문서에서는 Ubuntu 22.04에서 ss, lsof, fuser를 사용해 특정 TCP 또는 UDP 포트를 점유한 프로세스와 PID를 확인하는 방법을 설명합니다. 프로세스를 확인한 뒤 systemd 서비스와 연결하는 방법, 포트가 보이지 않을 때 점검할 항목, 안전하게 프로세스를 종료하는 방법도 함께 살펴보겠습니다.

적용 환경

항목 내용
운영체제 Ubuntu 22.04 LTS
기본 확인 도구 ssiproute2 패키지 제공
보조 도구 lsof, fuser
예시 포트 8080 — 실제 확인할 포트 번호로 변경

ss로 특정 포트 사용 프로세스 확인

Ubuntu 22.04에서는 네트워크 소켓을 확인할 때 ss를 우선 사용할 수 있습니다. Ubuntu 22.04의 ssiproute2 패키지에 포함되어 있으며, -p 옵션으로 소켓을 사용하는 프로세스 정보를 표시할 수 있습니다.

현재 수신 중인 TCP·UDP 소켓과 프로세스를 한 번에 확인하려면 다음 명령을 실행합니다.

sudo ss -lntup

주요 옵션의 의미는 다음과 같습니다.

  • -l: LISTEN 상태의 수신 소켓 표시
  • -n: 포트와 주소를 서비스명으로 변환하지 않고 숫자로 표시
  • -t: TCP 소켓 표시
  • -u: UDP 소켓 표시
  • -p: 해당 소켓을 사용하는 프로세스 정보 표시

예를 들어 8080번 포트를 확인할 때는 ss의 포트 필터를 사용하는 것이 정확합니다.

sudo ss -lntp 'sport = :8080'

포트를 사용하는 프로세스가 있다면 출력의 users: 부분에서 프로그램 이름과 pid= 값을 확인할 수 있습니다. 예를 들어 pid=1234가 표시되면 PID 1234 프로세스가 해당 소켓을 사용하고 있다는 의미입니다.

TCP와 UDP 포트를 구분해서 확인

같은 포트 번호라도 TCP와 UDP는 별도의 소켓이므로 프로토콜을 구분해 확인해야 합니다.

TCP 8080번 포트 확인

sudo ss -lntp 'sport = :8080'

UDP 8080번 포트 확인

sudo ss -lnup 'sport = :8080'

TCP는 연결 상태가 존재하지만 UDP는 연결 지향형 프로토콜이 아니므로 출력 형태가 다릅니다. 서비스가 UDP만 사용한다면 TCP 명령에서는 아무 결과도 나오지 않을 수 있습니다.

LISTEN 여부와 관계없이 해당 포트를 사용하는 소켓 확인

현재 연결된 TCP 소켓까지 포함해 확인하려면 -a 옵션을 사용하거나 LISTEN 전용 -l을 제외할 수 있습니다.

sudo ss -antp 'sport = :8080 or dport = :8080'

이 명령은 로컬 출발 포트 또는 상대방 목적지 포트가 8080인 TCP 연결까지 표시하므로, 서버가 8080번에서 실제로 수신하는 프로세스를 찾는 목적이라면 앞의 -lntp 'sport = :8080' 명령이 더 적합합니다.

lsof로 포트와 PID 확인

lsof는 프로세스가 열어 둔 파일과 네트워크 소켓을 확인하는 도구입니다. Ubuntu 22.04에서는 별도의 lsof 패키지로 제공됩니다.

설치 여부를 확인합니다.

command -v lsof

명령이 없으면 설치합니다.

sudo apt update
sudo apt install -y lsof

8080번 포트를 사용하는 프로세스를 확인합니다.

sudo lsof -nP -i :8080

-n은 호스트 이름 역조회 생략, -P는 포트 번호를 서비스명으로 변환하지 않도록 하는 옵션입니다. 출력에서 COMMAND, PID, USER, NAME을 확인하면 어느 프로세스가 어떤 주소와 포트를 사용 중인지 파악할 수 있습니다.

TCP LISTEN 소켓만 확인하려면 다음과 같이 범위를 좁힐 수 있습니다.

sudo lsof -nP -iTCP:8080 -sTCP:LISTEN

fuser로 PID 빠르게 확인

fuser는 파일이나 소켓을 사용하는 프로세스의 PID를 빠르게 찾을 때 유용합니다. Ubuntu 22.04에서는 psmisc 패키지에서 제공됩니다.

TCP 8080번 포트를 사용하는 PID와 사용자 정보를 확인합니다.

sudo fuser -v 8080/tcp

UDP 포트라면 다음과 같이 실행합니다.

sudo fuser -v 8080/udp

fuser가 설치되어 있지 않으면 다음 명령으로 설치할 수 있습니다.

sudo apt update
sudo apt install -y psmisc

PID로 프로세스와 systemd 서비스 확인

포트 점유 PID를 찾았다면 즉시 종료하기보다 어떤 프로그램이고 누가 실행했는지 먼저 확인합니다. 아래의 1234는 실제 PID로 변경하십시오.

ps -p 1234 -o pid,ppid,user,etime,cmd

실행 파일과 전체 명령줄도 확인할 수 있습니다.

sudo readlink -f /proc/1234/exe
sudo tr '\0' ' ' < /proc/1234/cmdline
echo

systemd가 관리하는 프로세스인지 확인하려면 해당 PID의 cgroup 정보를 조회합니다.

cat /proc/1234/cgroup
systemctl status 1234 --no-pager

systemd 서비스에 속한 프로세스라면 systemctl status에서 관련 유닛을 확인할 수 있습니다. 운영 서비스라면 PID를 직접 종료하는 것보다 해당 서비스 유닛을 통해 중지하거나 설정을 수정하는 편이 안전합니다.

포트를 점유한 프로세스 안전하게 종료

포트 충돌을 해결하기 위해 프로세스를 종료해야 한다면 먼저 해당 프로세스가 정상적인 서비스인지 확인합니다.

systemd 서비스인 경우

예를 들어 프로세스가 example.service에 속한다면 다음과 같이 서비스를 정상 종료합니다.

sudo systemctl stop example.service
sudo systemctl status example.service --no-pager

일반 프로세스인 경우

프로그램의 정상 종료 방법이 별도로 없다면 기본 TERM 신호부터 사용합니다.

sudo kill 1234

잠시 후 프로세스와 포트를 다시 확인합니다.

ps -p 1234
sudo ss -lntp 'sport = :8080'

포트가 확인되지 않을 때 점검할 항목

자주 발생하는 증상과 확인 방법
증상 가능한 원인 확인 방법 해결 방향
ss에 프로세스명이 보이지 않음 권한 부족 sudo ss -lntup로 재확인 관리자 권한으로 프로세스 정보 조회
TCP 명령에 결과가 없음 UDP 소켓이거나 실제 포트가 다름 sudo ss -lnup도 확인 TCP·UDP를 각각 확인
애플리케이션은 포트 충돌이라는데 현재 포트가 비어 있음 충돌 프로세스가 이미 종료되었거나 다른 네트워크 네임스페이스 사용 애플리케이션 로그와 컨테이너 환경 확인 Docker·Podman 등 별도 네임스페이스 여부 점검
lsof: command not found lsof 미설치 command -v lsof sudo apt install lsof 실행
프로세스를 종료해도 다시 포트를 점유함 systemd 또는 프로세스 관리자가 자동 재시작 systemctl status PID, 부모 프로세스 확인 서비스 설정 또는 애플리케이션 포트 설정을 수정

Docker 컨테이너가 포트를 사용하는 경우

호스트 포트가 컨테이너에 게시되어 있다면 Docker가 해당 포트를 관리할 수 있습니다. Docker를 사용하는 서버라면 다음 명령도 함께 확인합니다.

sudo docker ps --format 'table {{.ID}}\t{{.Names}}\t{{.Ports}}'

Docker가 설치되어 있지 않은 서버에서는 이 명령을 실행할 필요가 없습니다. 컨테이너 환경에서는 호스트의 포트와 컨테이너 내부 포트를 구분해야 합니다.

포트 해제 여부 확인

프로세스를 중지하거나 서비스 포트를 변경한 뒤에는 동일한 명령으로 포트 상태를 다시 확인합니다.

sudo ss -lntp 'sport = :8080'
sudo ss -lnup 'sport = :8080'

해당 포트를 사용하는 TCP·UDP 수신 소켓이 모두 없다면 출력이 나타나지 않습니다. 이후 원래 실행하려던 애플리케이션을 시작하고 다시 포트와 PID를 확인합니다.

sudo ss -lntup

새로 시작한 서비스가 예상한 포트에서 수신하고 있고 프로세스명과 PID가 의도한 값인지 확인하면 됩니다.

관련 지구 IDC 기술자료

공식 참고자료

기관 문서 확인 내용 조회일
Ubuntu Manpages ss(8) — Ubuntu 22.04 -l, -n, -p, TCP·UDP 옵션과 포트 필터 문법
Ubuntu Manpages lsof(8) — Ubuntu 22.04 네트워크 소켓을 포함한 열린 파일과 프로세스 조회, lsof 패키지
Ubuntu Manpages fuser(1) — Ubuntu 22.04 TCP·UDP 소켓을 사용하는 PID 확인, psmisc 패키지와 종료 옵션 주의사항
Ubuntu Project List of releases Ubuntu 22.04 LTS 지원 상태

자주 묻는 질문

netstat 대신 ss를 사용해도 되나요?

네. Ubuntu 22.04에서는 ssiproute2 패키지에 포함되어 있으며 별도의 net-tools 설치 없이 소켓과 프로세스를 확인할 수 있습니다. 기존 운영 절차에서 netstat를 사용하는 경우도 있지만 새 문서에서는 ss를 우선 사용할 수 있습니다.

특정 포트를 사용 중인 프로세스만 가장 빠르게 확인하려면 어떤 명령을 사용하면 되나요?

TCP LISTEN 포트라면 sudo ss -lntp 'sport = :포트번호'가 가장 간단합니다. PID 숫자만 빠르게 확인하려면 sudo fuser -v 포트번호/tcp도 사용할 수 있습니다.

포트를 점유한 PID를 찾으면 바로 kill -9 해도 되나요?

권장하지 않습니다. 먼저 ps, /proc/PID/cmdline, systemctl status PID로 프로세스의 역할을 확인하십시오. systemd 서비스라면 systemctl stop을 사용하고 일반 프로세스라면 정상 종료 방식 또는 기본 TERM 신호부터 사용하는 것이 안전합니다.

같은 포트 번호를 TCP와 UDP가 동시에 사용할 수 있나요?

가능합니다. TCP와 UDP는 별개의 프로토콜이므로 같은 숫자의 포트를 각각 사용할 수 있습니다. 따라서 포트 충돌을 진단할 때 실제 애플리케이션이 TCP인지 UDP인지 구분해야 합니다.

포트는 열려 있는데 외부에서 접속되지 않는 경우도 프로세스 문제인가요?

반드시 그렇지는 않습니다. ss에서 서비스가 정상적으로 수신 중이라면 바인딩 주소, UFW 또는 nftables 방화벽, 클라우드 보안 그룹, IDC 상위 방화벽과 네트워크 경로를 별도로 확인해야 합니다.

마무리

오늘은 Ubuntu 22.04에서 특정 포트를 사용 중인 프로세스를 ss, lsof, fuser로 확인하는 방법을 설명드렸습니다. 일반적인 서버에서는 먼저 ss로 포트와 프로세스를 확인하고, 필요한 경우 lsoffuser로 PID를 교차 확인하면 됩니다.

포트 충돌이 발생했더라도 프로세스를 바로 강제 종료하기보다는 PID가 어떤 서비스에 속하는지 먼저 확인하십시오. systemd가 관리하는 서비스라면 정상적인 서비스 중지 또는 설정 변경 절차를 사용해야 운영 중인 데이터와 서비스에 미치는 영향을 줄일 수 있습니다.

오늘 준비한 내용은 여기까지입니다. 다음에도 서버 운영에 도움이 되는 기술정보로 인사드리겠습니다.

  • 0 Users Found This Useful
Was this answer helpful?
« Back

Powered by WHMCompleteSolution