우분투 실전 명령어 | 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