lsof

lsof(LiSt Open Files)는 process가 열고 있는 regular file, directory, device, library, pipe, network socket 등의 정보를 조회하는 Unix 진단 명령어다.

sudo apt update
sudo apt install lsof
sudo dnf install lsof

구형 RHEL/CentOS 환경에서는 sudo yum install lsof를 사용할 수 있다.

macOS는 /usr/sbin/lsof를 기본 제공한다. upstream의 최신 release가 필요하면 Homebrew formula를 사용할 수 있다.

brew install lsof

lsof는 Unix kernel interface를 사용하는 도구이며 공식 native Windows 또는 winget package는 없다. Linux 동작이 필요하면 WSL distribution 안에서 설치한다. Native Windows에서는 목적에 따라 Resource Monitor, Process Explorer 또는 Get-NetTCPConnection을 사용한다.

설치 후 version을 확인한다.

lsof -v
lsof [OPTIONS] [NAMES]
  • lsof [OPTIONS] [NAMES]: 조건에 맞는 열린 file 정보를 표시한다.
  • lsof PATH: 특정 path 또는 filesystem에서 열린 file을 찾는다.
  • lsof -i [ADDRESS]: Internet socket을 조회한다.

option 없이 실행하면 접근 가능한 모든 process의 열린 file을 나열하므로 출력이 매우 클 수 있다.

주요 기본 column은 다음과 같다.

  • COMMAND: process command name
  • PID / TID: process ID / thread ID
  • USER: process owner
  • FD: file descriptor 또는 cwd, rtd, txt, mem 같은 역할
  • TYPE: REG, DIR, IPv4, IPv6, unix 등의 file type
  • DEVICE, SIZE/OFF, NODE: device, size/offset, inode 정보
  • NAME: file path 또는 network endpoint

FD의 숫자 뒤 r, w, u는 각각 read, write, read/write access를 뜻한다.

  • -a: 여러 selection 조건을 AND로 결합한다. 기본 selection 조건은 대체로 OR로 결합된다.
  • -c COMMAND: command name prefix로 process를 선택한다.
  • -p PID_SET: PID를 선택한다. comma-separated list와 ^PID 제외 조건을 지원한다.
  • -u USER_SET: login name 또는 UID를 선택한다.
  • -d FD_SET: file descriptor 종류나 번호를 선택한다.
  • -i [ADDRESS]: IPv4/IPv6 socket을 선택한다.
  • -s PROTOCOL:STATE: TCP/UDP state를 선택한다.
  • -U: Unix domain socket을 선택한다.
  • -n: host name resolution을 생략한다.
  • -P: port name resolution을 생략하고 숫자로 표시한다.
  • -t: PID만 출력한다.
  • -F [FIELDS]: script가 parsing하기 쉬운 field 형식으로 출력한다.
  • +d DIR: 지정 directory의 바로 아래에서 열린 file을 찾는다.
  • +D DIR: 하위 directory까지 재귀 검색한다. 큰 tree에서는 느릴 수 있다.
  • +L1: link count가 1보다 작은 열린 file, 즉 삭제됐지만 process가 잡고 있는 file을 찾는다.
  • +r [SECONDS]: 결과가 없어질 때까지 반복한다.
  • -r [SECONDS]: 중단할 때까지 반복한다.
lsof /var/log/syslog
sudo lsof /var/lib/mysql/mysql.sock
lsof -p 1234
lsof -c nginx
sudo lsof -nP -iTCP -sTCP:LISTEN
sudo lsof -nP -iTCP:8080 -sTCP:LISTEN

-nP는 DNS와 service name 조회를 생략해 결과를 빠르고 명확한 숫자로 표시한다.

sudo lsof -nP -a -u www-data -i

-a가 없으면 user 조건과 network 조건이 OR로 결합될 수 있으므로 교집합 검색에는 반드시 -a를 사용한다.

sudo lsof /mnt/data
sudo lsof +L1

log file을 삭제했는데 disk space가 반환되지 않을 때 이 결과에서 해당 process를 찾고 정상적인 reopen 또는 restart 절차를 적용한다.

lsof -t -- /path/to/file
사람이 읽는 기본 column을 awk로 parsing하면 version과 OS에 따라 깨질 수 있다. 자동화에는 -F field output을 우선 사용한다.
  • 결과가 비어 있거나 일부 process가 누락됨: 다른 user의 process와 kernel 정보는 권한에 따라 보이지 않을 수 있다. 필요한 범위에서 sudo로 다시 확인한다.
  • 실행이 느림: name resolution을 끄는 -nP를 사용하고, 넓은 +D 재귀 검색 대신 정확한 path 또는 +d를 사용한다.
  • 여러 조건이 너무 많이 일치함: selection option은 기본적으로 OR 관계다. 조건의 교집합이 필요하면 -a를 추가한다.
  • port 출력이 service name으로 표시됨: -P를 추가한다. host name resolution도 끄려면 -nP를 사용한다.
  • Linux container 또는 PID namespace 밖의 process가 보이지 않음: lsof는 현재 namespace와 permission 범위에서 kernel 정보를 읽는다. host 또는 대상 namespace 안에서 실행한다.

lsof는 Linux, macOS(Darwin), FreeBSD, NetBSD, OpenBSD, Solaris/OpenIndiana 등 Unix 계열을 지원하지만 kernel interface와 build option에 따라 column, file type, option 지원이 다를 수 있다. 이 페이지의 help 출력은 로컬 lsof 4.93.2에서 수집했으며 최신 upstream release와 차이가 있을 수 있다.

lsof -h (4.93.2)

  • codex:: 2026-08-04 설치, 출력 해석, file·process·socket 조회, 자동화, 문제 해결 및 실제 help 출력을 포함한 명령 페이지를 추가했다.
  • /home/u613600155/domains/cli.zerotymer.net/public_html/data/pages/lsof/ko.txt
  • 마지막으로 수정됨: 2026/08/04 04:49
  • (바깥 편집)