핵심 요약
리눅스에서 "모든 것은 파일"이라 lsof(list open files)는 열린 파일·소켓·포트를 전부 추적할 수 있다. 어떤 프로세스가 특정 포트를 점유했는지, 삭제했는데 디스크가 안 비는 이유가 무엇인지, 마운트 해제를 막는 프로세스가 뭔지를 한 번에 찾는다.
1. 포트를 누가 쓰나
lsof -i :3000 # 3000 포트를 쓰는 프로세스
lsof -i tcp:8080 # TCP 8080만
lsof -i -P -n | grep LISTEN # 리스닝 중인 모든 포트
-P는 포트를 번호 그대로, -n은 IP를 숫자로 표시해 빠르다. PID를 얻으면 kill로 종료.
2. 파일을 누가 잡고 있나
lsof /var/log/app.log # 이 파일을 연 프로세스
lsof +D /var/data # 디렉터리 이하 전부(느림)
lsof -u deploy # deploy 사용자가 연 것 전부
3. "지웠는데 디스크가 안 빈다"
# 삭제됐지만 프로세스가 아직 붙잡은 파일
lsof +L1
# 또는
lsof | grep deleted
파일을 rm해도 열어둔 프로세스가 있으면 공간이 반환되지 않는다(특히 로그). 해당 프로세스를 재시작하거나 로그를 truncate해야 실제로 빈다.
4. 자주 쓰는 조합
| 목적 | 명령 |
|---|---|
| 특정 프로세스가 연 것 | lsof -p PID |
| 네트워크 연결 전체 | lsof -i |
| 포트 점유 PID만 | lsof -t -i:3000 |
| 바로 죽이기 | kill -9 $(lsof -t -i:3000) |
5. 대안 · 팁
- 포트만 빠르게 볼 땐
ss -tulpn(요즘netstat보다 권장)도 좋다 lsof -t는 PID만 출력해 스크립트·파이프에 쓰기 좋다- 권한 문제로 일부가 안 보이면
sudo로 실행
자주 묻는 질문
lsof와 ss(netstat) 중 뭘 쓰나요?
순수하게 포트·소켓 상태만 빠르게 보려면 ss -tulpn이 가볍고 빠릅니다. 파일·소켓·삭제된 파일까지 폭넓게 추적하려면 lsof가 만능입니다. 포트 점유 범인 찾기는 둘 다 되고, 파일 핸들 문제는 lsof가 유일합니다.
파일을 rm했는데 df 용량이 그대로예요.
프로세스가 그 파일을 아직 열고 있으면 inode가 유지돼 공간이 반환되지 않습니다. lsof | grep deleted로 범인을 찾아 재시작하거나, 로그라면 : > file로 내용을 비우면 즉시 반환됩니다.
lsof -i:3000이 아무것도 안 나와요.
다른 사용자(root 등)가 연 소켓은 권한 때문에 안 보일 수 있습니다. sudo lsof -i:3000으로 다시 시도하세요. 그래도 없으면 실제로 그 포트를 쓰는 프로세스가 없거나 다른 인터페이스에 바인딩된 것입니다.

댓글 0