우분투 실전 명령어 | ss/lsof로 포트 점유 프로세스 추적

언제 쓰는가

서비스가 안 뜨거나 이미 사용 중인 포트 오류가 날 때 가장 먼저 확인하는 조합이다.
운영 중에는 포트를 누가 잡고 있는지, 프로세스가 어떤 PID인지, 실제로 외부에서 리슨 중인지 빠르게 확인해야 장애 시간을 줄일 수 있다.

바로 쓰는 명령어

# 1) 현재 리슨 중인 TCP/UDP 포트와 프로세스 확인
sudo ss -lntup

# 2) 특정 포트(예: 8080) 점유 프로세스 확인
sudo ss -lntup | grep ':8080'

# 3) PID를 기준으로 상세 커맨드라인 확인
ps -fp "$PID"
# 4) lsof로 포트 소유 프로세스 확인
sudo lsof -iTCP:8080 -sTCP:LISTEN -nP

# 5) 프로세스 종료 후 재확인
sudo kill -TERM "$PID"
sleep 1
sudo ss -lntup | grep ':8080' || echo '8080 포트 비어 있음'

핵심 옵션/패턴

  • ss -l: 리슨 소켓만 본다.
  • ss -n: 포트와 주소를 숫자로 출력해 조회 속도가 빠르다.
  • ss -t/-u: TCP/UDP를 구분해서 볼 수 있다.
  • ss -p: 소켓을 연 프로세스 정보를 함께 출력한다.
  • lsof -iTCP:PORT -sTCP:LISTEN: 특정 TCP 포트의 리슨 프로세스만 정확히 집는다.
  • -nP: DNS 조회와 서비스명 변환을 끄고 원본 IP:PORT 숫자를 그대로 보여준다.

실무에서는 ss로 전체 상황을 먼저 보고, lsof로 특정 포트를 정밀 확인하는 순서가 가장 빠르다.

명령 출력 예시

$ sudo ss -lntup | grep ':8080'
tcp   LISTEN 0      4096         0.0.0.0:8080      0.0.0.0:*    users:(("java",pid=21437,fd=123))
$ sudo lsof -iTCP:8080 -sTCP:LISTEN -nP
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    21437  app  123u  IPv4  81234      0t0  TCP *:8080 (LISTEN)

자주 하는 실수

  • sudo 없이 실행해서 프로세스 정보가 안 보이는데 포트가 비어 있다고 오해한다.
  • 127.0.0.1 바인딩 서비스를 외부 접속 문제로 착각한다.
  • kill -9를 습관적으로 먼저 써서 정상 종료 기회를 날리고 데이터 정합성 문제를 만든다.

검증 방법

# 포트 리슨 상태 확인
sudo ss -lntup | grep ':8080'

# 프로세스 생존 여부 확인
ps -p "$PID" -o pid,ppid,user,cmd

# 로컬 헬스체크
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080/health

포트를 정리한 뒤에는 헬스체크 HTTP 코드까지 확인해야 실제 복구 완료 여부를 확실히 판단할 수 있다.

운영 팁

장애 대응 중에는 먼저 현재 점유 PID와 시작 시각을 기록해 두면 원인 분석 속도가 훨씬 빨라진다.
예를 들어 ps -p "$PID" -o lstart,cmd 결과를 티켓에 남겨두면 재발 시 비교가 쉬워지고, 배포 직후 발생한 포트 충돌인지도 바로 구분할 수 있다.

출처

man ss
man lsof
iproute2
lsof