노트

포트를 쓰는 프로세스 찾아 종료하기

Finding and Killing the Process Using a Port

인프라#linux · 연결된 개념 4개

쉽게 말하면

포트 충돌은 내 지정 주차 자리에 이미 다른 차가 서 있는 상황이에요. lsof로 그 차 주인을 찾아 먼저 정중히 빼 달라 하고, 그래도 안 비켜 주면 견인하듯 강제로 끝내요.

비유가 깨지는 곳 정중한 요청인 SIGTERM은 프로세스가 연결과 파일을 정리할 기회를 주지만, 견인인 kill -9는 정리 없이 즉시 끝내요. 끄자마자 다시 자리를 차지하면 launchd 같은 매니저가 되살리는지 봐요.

"address already in use"로 서버가 안 뜰 때, 그 포트를 잡고 있는 프로세스를 lsof로 찾아 끈다. lsof(list open files)는 열린 파일과 소켓을 쓰는 프로세스를 보여준다.

lsof -i :3000                       # 누가 쓰는지 자세히
lsof -ti :3000 -sTCP:LISTEN         # 리슨 중인 PID만
kill $(lsof -ti :3000 -sTCP:LISTEN) # 정상 종료 요청
lsof -ti :3000 | xargs kill -9      # 강제 종료
  • -t: PID만 간결하게 출력한다. 다른 명령에 넘기기 좋다
  • -i :포트: 해당 포트를 쓰는 인터넷 소켓만 고른다
  • -sTCP:LISTEN: 리슨 상태만 고른다. 그 포트에 접속한 클라이언트까지 죽이는 실수를 막는다
  • 다른 사용자(root 등)의 프로세스는 sudo가 있어야 보인다

kill과 kill -9

  • kill PID는 SIGTERM(종료 요청 시그널)을 보낸다. 프로세스가 연결을 닫고 파일을 정리한 뒤 끝날 기회를 준다
  • kill -9 PID는 SIGKILL이다. 잡을 수도 무시할 수도 없어 즉시 죽지만 정리 작업이 생략된다
  • 먼저 SIGTERM, 안 되면 SIGKILL 순서가 좋다

리눅스 서버에서는 ss -ltnp나 fuser -k 3000/tcp도 같은 일을 한다. 계속 같은 포트가 남아 있다면 프로세스 매니저나 macOS launchd로 상주 프로세스 띄우기가 자동으로 되살리고 있는지 확인한다. 컨테이너가 포트를 잡고 있다면 docker ps로 찾는다.

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 운영 Node 프로세스의 메모리 누수 찾기

    살아 있는 Node 서버에 inspector를 붙이고, 힙 스냅샷 두 장을 비교해 무엇이 쌓이는지, retainer로 누가 붙잡고 있는지 찾는 절차.

  • 커넥션 드레이닝과 무중단 재시작

    배포 중 서버를 재시작하는 몇 초 동안 로드밸런서가 그 서버로 요청을 보내면 502가 난다. 먼저 로드밸런서에서 빼고(드레이닝), 진행 중인 요청을 마친 뒤 재시작하고, 준비되면 다시 넣는다.

  • kubectl 디버깅 치트시트

    kubectl은 쿠버네티스 클러스터를 조회·조작하는 CLI(Command-Line Interface)다. 앱 개발자가 가장 자주 쓰는 건 "내 Pod가 떠 있나, 왜 죽었나"를 확인하는 명령들이다.

  • hosts 파일

    도메인 이름과 IP 주소의 짝을 적어 두는 OS(Operating System)의 텍스트 파일. 이름을 해석할 때 DNS 서버보다 먼저 참조되므로, 특정 도메인을 내 컴퓨터나 다른 IP로 보내는 데 쓴다. macOS·Linux는 /etc/hosts, Windows는 C:\Windows\System32\drivers\etc\hosts다.

  • bash strict mode (set -euo pipefail)

    셸 스크립트 맨 위에 두는 set -euo pipefail은 실패를 조용히 넘기지 않게 하는 관용구다. 공식 기능 이름은 아니고, 흔히 "비공식 bash strict mode"라고 부른다.

보기 옵션