우분투 실전 명령어 | lsof/fuser로 포트 충돌 프로세스 찾기

언제 쓰는가

운영 중인 서버에서 "포트는 열려 있는데 어떤 프로세스가 잡고 있는지" 빨리 확인해야 할 때가 자주 있습니다. 특히 배포 직후 address already in use 에러가 나면 서비스 코드보다 먼저 포트 점유 상태부터 봐야 시간을 아낄 수 있습니다. 이 글은 lsof, ss, fuser 조합으로 포트 충돌을 안전하게 진단하고 정리하는 최소 패턴만 정리합니다.

바로 쓰는 명령어

# 1) 8080 포트를 누가 LISTEN 중인지 확인
sudo ss -ltnp | grep ':8080'

# 2) PID 기준으로 프로세스 상세 확인
ps -fp <PID>

# 3) lsof로 포트 점유 프로세스 확인 (프로세스명/유저까지 함께 확인)
sudo lsof -iTCP:8080 -sTCP:LISTEN -nP
# fuser로 포트 점유 PID 확인
sudo fuser -v 8080/tcp

# 정말 종료가 필요할 때만 (사전 확인 후)
sudo kill -TERM <PID>

# 종료 후 포트 해제 확인
sudo ss -ltnp | grep ':8080' || echo "8080 포트 리스닝 프로세스 없음"

핵심 옵션/패턴

  • ss -ltnp
  • -l: LISTEN 소켓만
  • -t: TCP만
  • -n: 포트/주소를 숫자로 표시(DNS 역조회 지연 방지)
  • -p: PID/프로세스명 표시(권한 필요)
  • lsof -iTCP:포트 -sTCP:LISTEN -nP
  • 실제 서비스가 리스닝 중인지 빠르게 단정할 때 유용합니다.
  • kill -TERMkill -KILL 순서
  • 운영에서는 먼저 정상 종료 시그널(TERM)을 주고, 반응이 없을 때만 강제 종료(KILL)를 고려합니다.

자주 하는 실수

  • sudo 없이 확인해서 PID가 비어 보이는데 "프로세스가 없다"고 판단하는 실수
  • LISTEN이 아닌 ESTABLISHED 연결을 보고 점유 프로세스를 잘못 잡는 실수
  • 바로 kill -9부터 사용해 데이터 flush/정리 기회를 날리는 실수
  • 시스템 서비스 PID를 임시 앱으로 착각해 종료해버리는 실수(항상 ps -fp PID로 재확인)

검증 방법

# 포트 점유 여부 + 서비스 응답까지 함께 확인
sudo ss -ltnp | grep ':8080'
curl -I http://127.0.0.1:8080
  • ss 결과에 목표 PID가 보이고
  • curl 응답 코드(200/301/302 등)가 기대와 맞으면 정상입니다.

운영 팁

  • 배포 스크립트에 "기동 전 포트 점유 점검" 단계를 넣어두면 충돌을 사전에 차단할 수 있습니다.
  • 같은 서버에서 여러 앱을 띄울 때는 서비스별 포트 맵(예: 8080, 8081, 9090)을 문서로 고정해 두면 재발이 줄어듭니다.

출처

  • Ubuntu Manpages
  • Linux man-pages project
  • Red Hat Documentation