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

언제 쓰는가

서버에서 이미 사용 중인 포트 때문에 서비스가 안 뜰 때 가장 먼저 확인하는 명령이 lsof다. 특정 포트를 누가 잡고 있는지 PID까지 바로 확인할 수 있어서 재시작 전에 원인 파악이 빠르다.

바로 쓰는 명령어

# 8080 포트를 점유한 프로세스 확인
sudo lsof -i :8080

# TCP LISTEN 상태만 깔끔하게 확인
sudo lsof -nP -iTCP:8080 -sTCP:LISTEN

# 프로세스 이름(node)가 연 포트 확인
sudo lsof -nP -iTCP -sTCP:LISTEN -c node
# PID만 뽑아서 후속 처리
pid=$(sudo lsof -t -iTCP:8080 -sTCP:LISTEN)
echo "$pid"

# 필요 시 정상 종료 시도
sudo kill -15 "$pid"

핵심 옵션/패턴

  • -i :8080: 해당 포트 관련 소켓만 조회한다.
  • -iTCP:8080 -sTCP:LISTEN: 연결 중인 세션은 제외하고 리슨 중인 프로세스만 본다.
  • -nP: DNS 역조회와 포트명 변환을 끄고 숫자로 보여서 출력이 빠르고 해석이 쉽다.
  • -t: PID만 출력해 스크립트에서 재사용하기 좋다.
  • -c node: 프로세스 이름 기준으로 빠르게 필터링한다.

명령 출력 예시

$ sudo lsof -nP -iTCP:8080 -sTCP:LISTEN
COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node    21457 ubuntu  23u  IPv4 0x8d01a9f8b3f2c111      0t0  TCP *:8080 (LISTEN)
$ pid=$(sudo lsof -t -iTCP:8080 -sTCP:LISTEN)
$ echo "$pid"
21457

자주 하는 실수

  • sudo 없이 실행해서 아무 결과가 없다고 오해한다. 다른 사용자 소유 프로세스는 안 보일 수 있다.
  • -nP 없이 실행해 조회가 느린데 시스템 문제로 착각한다.
  • LISTEN 필터 없이 확인해서 단순 접속 세션까지 포함된 출력을 보고 잘못 종료한다.
  • PID를 확인하지 않고 바로 kill -9를 사용해 정상 종료 기회를 날린다.

검증 방법

# 종료 전 점유 확인
sudo lsof -nP -iTCP:8080 -sTCP:LISTEN

# 종료 후 점유 해제 확인
sudo lsof -nP -iTCP:8080 -sTCP:LISTEN || echo "LISTEN 프로세스 없음"

# 서비스 재기동 후 재확인
sudo systemctl restart myapp
sudo lsof -nP -iTCP:8080 -sTCP:LISTEN

운영 팁

포트 충돌이 자주 나는 서비스는 systemd 유닛에 ExecStartPre 단계로 점유 검사 스크립트를 넣어두면 장애를 조기에 감지할 수 있다. 운영 중에는 kill -15로 정상 종료를 먼저 시도하고, 일정 시간 뒤에도 남아 있을 때만 강제 종료로 넘어가는 순서를 습관화하는 게 안전하다.

출처

  • man lsof
  • man kill
  • Ubuntu Server Guide