리눅스
lsof ( list open files)
정지홍
2024. 7. 10. 10:32
lsof
- 시스템에서 열려있는 파일에 대한 정보를 출력하는 명령어
- 일반 파일과 디렉토리,소켓,파이프,블록 디바이스에 대한 관리를 파일 시스템을 통해서 할수있음
- 즉, 특정 프로세스가 열고 있는 fd를 조회하는 것이며 시스템을 모니터링하는데 도움됨
- ex) 프로세스가 열고 있는 파일을 지웠을때 ls로 보이지 않으나 실제로 안지워지고 남아있는 경우가 존재하며, 이렇게 되면 해당 process가 열어 둔 파일이 위치한 디스크가 정상적으로 언마운트 안됨. 그래서 조회를 해야함.
[root@localcentos ~]# yum install lsof
# 우선 설치해야함
[root@localcentos ~]# lsof
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 224 64 /
systemd 1 root rtd DIR 253,0 224 64 /
systemd 1 root txt REG 253,0 1632776 316460 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,0 20064 85768 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 253,0 265576 257528 /usr/lib64/libblkid.so.1.1.0
systemd 1 root mem REG 253,0 90248 42131 /usr/lib64/libz.so.1.2.7
#시스템에 있는 모든 열린 파일에 대해서 출력
- COMMAND 실행한 명령어
- PID 프로세스 아이디
- USER 명령어를 실행한 사용자
- FD 파일디스크럽터 종류
- TYPE 파일의 종류
- DEVICE 디바이스 번호
- SIZE/OFF 파일의 크기 or 현재 오프셋
- NODE 아래중에 하나
- 로컬 파일의 노드 번호
- 서버 호스트에서 NFS 파일의 iNode 번호
- 인터넷 프로토콜 타입
- 리눅스 소켓 디바이스의 INode번호 or IRQ
- NAME 파일 이름
파일 디스크럽터 종류
- Lnn : Library references
- err : FD information error
- jld : jail directory
- ltx : shared Library text
- Mxx : Hex memory-mapped type number xx
- mem : memory-mapped file
- mmap : memory-mapped device
- pd : parent dir
- red : root dir
- tr : kernel trace file
- txt : program text (code and data)
- NUMBER : 숫자만 오는 경우
- 숫자는 FD번호
- 뒤에 오는 문자 의미
- r : read access
- w : write access
- u : read n write access
=======-u 옵션===특정 사용자에 대한 조회===========
[root@localcentos ~] # lsof -u root
# -u 옵션은 특정 사용자가 오픈한 파일을 출력한다.
=======-u^ 옵션===특정 사용자를 제외하고 조회===========
[root@localcentos ~] # lsof -u^root
# -u^ 옵션은 특정 사용자를 제외한 나머지 사용자가 오픈한 파일 출력
========l옵션======계정이름이 아니라 유저아이디로 바꿔서 출력======
[root@localcentos ~]# lsof -l
======path 옵션=====특정 경로에서 오픈한 프로세스 조회=========
[root@localcentos ~] # lsof /dev/pts
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 16637 root 0u CHR 136,2 0t0 5 /dev/pts/2
bash 16637 root 1u CHR 136,2 0t0 5 /dev/pts/2
bash 16637 root 2u CHR 136,2 0t0 5 /dev/pts/2
# 특정한 경로를 주면 해당 경로의 오픈된 프로세스들을 출력
========+D 옵션====특정 디렉토리에서 오픈 한 파일들 보기=======
[root@localcentos ~] # lsof +D /bin
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dbus-daem 721 dbus txt REG 253,0 223232 101262403 /usr/bin/dbus-daemon
VGAuthSer 735 root txt REG 253,0 132600 101373061 /usr/bin/VGAuthService
# 특정 디렉토리의 열린 파일 보기
================-i 4옵션=====ipv4=======
[root@localcentos ~] # lsof -i 4
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
master 1321 root 13u IPv4 21907 0t0 TCP localhost:smtp (LISTEN)
ntpd 10938 ntp 16u IPv4 42167 0t0 UDP *:ntp
ntpd 10938 ntp 18u IPv4 42173 0t0 UDP localhost:ntp
ntpd 10938 ntp 19u IPv4 65621 0t0 UDP localcentos:ntp
sshd 15123 root 3u IPv4 44020 0t0 TCP *:ssh (LISTEN)
sshd 16625 root 3u IPv4 54055 0t0 TCP 172.16.25.132:ssh->172.16.25.1:53011 (ESTABLISHED)
# -i 4는 ipv4로 오픈한 소켓에 대한 정보들이 나온다.
================-i 6옵션=====ipv6=======
[root@localcentos ~] # lsof -i 6
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
master 1321 root 14u IPv6 21908 0t0 TCP localhost:smtp (LISTEN)
ntpd 10938 ntp 17u IPv6 42168 0t0 UDP *:ntp
ntpd 10938 ntp 20u IPv6 42175 0t0 UDP localhost:ntp
# -i 6는 ipv6에 대한 정보를 알수있음.
======i옵션 ========특정 프로토콜과 포트정보를 출력=======
[root@localcentos ~] # lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
master 1321 root 13u IPv4 21907 0t0 TCP localhost:smtp (LISTEN)
master 1321 root 14u IPv6 21908 0t0 TCP localhost:smtp (LISTEN)
ntpd 10938 ntp 16u IPv4 42167 0t0 UDP *:ntp
ntpd 10938 ntp 17u IPv6 42168 0t0 UDP *:ntp
ntpd 10938 ntp 18u IPv4 42173 0t0 UDP localhost:ntp
ntpd 10938 ntp 19u IPv4 65621 0t0 UDP localcentos:ntp
ntpd 10938 ntp 20u IPv6 42175 0t0 UDP localhost:ntp
# 모든 네트워크에 대한 정보를 얻는다.
# 이외에도 -i TCP , -i UDP는 해당 포트를 확인할수있다
# 예를 들어서 lsof -i TCP:22입력시 22번 포트를....
# 1024:2048입력시 1024~2048에 대한 정보를 얻는다.
============c옵션====특정 명령어를 사용하고 있는 정보를 출력=======
[root@localcentos ~] # lsof -c sshd
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 15123 root cwd DIR 253,0 224 64 /
sshd 15123 root rtd DIR 253,0 224 64 /
sshd 15123 root txt REG 253,0 852856 395964 /usr/sbin/sshd
# 특정 명령어가 사용하는 파일 정보를 얻으려면 -c옵션을 주면 됨
=======p옵션=============특정 pid가 참조하는것들을 출력=======
[root@localcentos ~] # lsof -p 20367
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 20367 root cwd DIR 253,0 4096 67149889 /root
bash 20367 root rtd DIR 253,0 224 64 /
bash 20367 root txt REG 253,0 964536 100666964 /usr/bin/bash
bash 20367 root mem REG 253,0 61560 36459 /usr/lib64/libnss_files-2.17.so
bash 20367 root mem REG 253,0 106172832 100666955 /usr/lib/locale/locale-archive
bash 20367 root mem REG 253,0 2156272 36441 /usr/lib64/libc-2.17.so
bash 20367 root mem REG 253,0 19248 36447 /usr/lib64/libdl-2.17.so
bash 20367 root mem REG 253,0 174576 42114 /usr/lib64/libtinfo.so.5.9
bash 20367 root mem REG 253,0 163312 36434 /usr/lib64/ld-2.17.so
# -p pid는 특정 프로세스가 사용하는 정보를 얻음
==============d옵션======해당 fd기준으로 정보를 출력=======
[root@localcentos ~]# lsof -d 0
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 0u CHR 1,3 0t0 1028 /dev/null
systemd-j 515 root 0r CHR 1,3 0t0 1028 /dev/null
lvmetad 540 root 0r CHR 1,3 0t0 1028 /dev/null
=======-t옵션===== 특정 경로를 주면 해당 경로의 파일을 오픈한 프로세스ID를 얻을수있음====
[root@localcentos /]# lsof -t /root
20367
# -t옵션은 특정 경로를 주면 해당 경로의 파일을 오픈한 프로세스ID를 얻을수있음