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