서버를 다루다 보면 Address already in use 또는 “포트가 이미 사용 중”이라는 에러를 자주 만납니다. 새로 프로그램을 실행하려는데, 그 포트를 다른 프로세스가 이미 쓰고 있다는 뜻입니다. 이 글에서는 이 에러의 원인과 해결 방법을 정리했습니다.
1. 에러의 의미
하나의 포트는 동시에 하나의 프로세스만 점유할 수 있습니다. 예를 들어 80번 포트로 웹 서버를 띄우려는데 이미 다른 웹 서버가 80번을 쓰고 있다면, 새 프로그램은 실행되지 못하고 이 에러를 냅니다.
2. 어떤 프로세스가 포트를 쓰는지 찾기
가장 먼저 그 포트를 누가 점유하고 있는지 확인합니다. lsof를 사용하는 방법이 가장 직관적입니다.
sudo lsof -i :8080
8080 자리에 문제의 포트 번호를 넣으면, 그 포트를 쓰는 프로세스의 이름과 PID가 나옵니다.
ss 명령으로도 확인할 수 있습니다.
sudo ss -ltnp | grep :8080
3. 프로세스 종료하기
점유 중인 프로세스가 불필요한 것이라면 종료합니다. 위에서 찾은 PID를 사용합니다.
kill -15 PID
정상적으로 종료되지 않으면 강제 종료합니다.
kill -9 PID
-9는 최후의 수단입니다. 데이터를 저장할 틈 없이 즉시 종료되므로 가급적 -15를 먼저 시도하세요.
4. 종료 후에도 안 될 때 (TIME_WAIT)
프로세스를 껐는데도 잠시 포트가 안 잡히는 경우가 있습니다. 이는 연결 종료 후 잠깐 남는 TIME_WAIT 상태 때문입니다. 보통 몇십 초 기다리면 자동으로 해제됩니다. 개발 환경에서는 프로그램에 포트 재사용(SO_REUSEADDR) 옵션을 켜서 해결하기도 합니다.
5. 아예 다른 포트를 쓰기
기존 프로세스를 끄면 안 되는 상황이라면, 새로 실행하는 프로그램의 포트를 바꾸는 것이 더 깔끔합니다. 예를 들어 8080 대신 8081을 사용하도록 설정을 변경합니다.
6. 자주 겪는 상황
가장 흔한 경우는 프로그램을 종료했다고 생각했는데 백그라운드에 좀비처럼 남아 있는 경우입니다. 또는 같은 서비스를 두 번 실행하려 했거나, 자동 재시작 설정 때문에 이미 떠 있는 경우도 많습니다. lsof로 확인하면 대부분 금방 정체가 드러납니다.
마무리
포트 충돌 해결의 핵심은 lsof로 점유 프로세스 찾기 → 필요 시 종료, 아니면 포트 변경입니다. 무작정 kill -9로 끄기보다는, 그 프로세스가 무엇인지 먼저 확인하는 습관이 중요합니다. 그래야 중요한 서비스를 실수로 종료하는 사고를 막을 수 있습니다.