lsof 사용법
lsof 는 list open files 의 약자로 시스템에서 열린 파일 목록을 알려주고 사용하는 프로세스, 디바이스 정보, 파일의 종류등 상세한 정보를 출력해 준다.
리눅스와 유닉스는 추상화된 파일 시스템(VFS - Virtual File System)을 사용하므로 일반 파일, 디렉터리, 네트워크 소켓, 라이브러리, 심볼릭 링크 등도 모두 파일로 처리되며 lsof 에서 상세한 정보를 확인할 수 있다.
유닉스마다 고유의 lsof 와 비슷한 용도의 명령어가 있지만 명령어와 옵션이 제각각이고 출력 정보가 상이하여 OS 가 바뀌면 사용하기가 힘들다.
lsof 는 리눅스, AIX, Solaris, FreeBSD, Mac OS X 등 종류에 상관없이 일관된 옵션과 출력 형식을 갖는 장점이 있다.
File
모든 열린 파일 출력
옵션 없이 lsof 를 실행하면 모든 열린 파일 정보를 출력한다.
$ lsof
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 253,0 4096 2 / init 1 root rtd DIR 253,0 4096 2 / init 1 root txt REG 253,0 150352 3932 /sbin/init init 1 root mem REG 253,0 65928 784927 /lib64/libnss_files-2.12.so init 1 root DEL REG 253,0 784911 /lib64/libc-2.12.so init 1 root DEL REG 253,0 785325 /lib64/libgcc_s-4.4.7-20120601.so.1.#prelink#.YDRQV5 init 1 root DEL REG 253,0 784939 /lib64/librt-2.12.so init 1 root DEL REG 253,0 784935 /lib64/libpthread-2.12.so.#prelink#.0jHMuJ init 1 root DEL REG 253,0 785344 /lib64/libdbus-1.so.3.4.0.#prelink#.HCYJdq init 1 root mem REG 253,0 39896 785047 /lib64/libnih-dbus.so.1.0.0 init 1 root mem REG 253,0 101920 785049 /lib64/libnih.so.1.0.0 init 1 root DEL REG 253,0 784904 /lib64/ld-2.12.so init 1 root 0u CHR 1,3 0t0 4160 /dev/null init 1 root 1u CHR 1,3 0t0 4160 /dev/null init 1 root 2u CHR 1,3 0t0 4160 /dev/null init 1 root 3r FIFO 0,8 0t0 8845 pipe init 1 root 4w FIFO 0,8 0t0 8845 pipe init 1 root 5r DIR 0,10 0 1 inotify init 1 root 6r DIR 0,10 0 1 inotify init 1 root 7u unix 0xffff880037504680 0t0 8846 socket
컬럼별 의미는 다음과 같다.
- COMMAND : 실행한 명령어
- PID : process id
- USER : 실행한 사용자
- FD: File Descriptor, 파일의 종류.
- cwd: current working directory
- rtd: root directory
- mem : memory-mapped file
- txt: program text (code and data);
- TYPE: 파일 종류
- DIR: 디렉터리
- CHR: character special file
- REG: regular file
- unix: 유닉스 도메인 소켓 (MySQL 등이 사용하는 소켓으로 로컬 프로세스에서만 사용 가능하며 TCP/UDP 보다 속도가 매우 빠름)
- DEVICE : 장치 번호
- SIZE/OFF: 파일의 크기나 오프셋
- NODE: 노드 번호
- NAME: 파일명
특정 사용자의 열린 파일 출력
-u 옵션으로 사용자를 지정할 수 있다.
lsof -u buster|more
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1096 buster cwd DIR 259,5 4096 2 /
systemd 1096 buster rtd DIR 259,5 4096 2 /
systemd 1096 buster txt REG 259,5 1640496 7351380 /usr/lib/systemd/systemd
systemd 1096 buster mem REG 259,5 1332096 7349471 /usr/lib/libm-2.32.so
systemd 1096 buster mem REG 259,5 153696 7346531 /usr/lib/libudev.so.1.6.18
systemd 1096 buster mem REG 259,5 42976 7346319 /usr/lib/libffi.so.7.1.0
systemd 1096 buster mem REG 259,5 1574704 7346533 /usr/lib/libunistring.so.2.1.0
systemd 1096 buster mem REG 259,5 153560 7346354 /usr/lib/libgpg-error.so.0.30.0
systemd 1096 buster mem REG 259,5 71648 7346382 /usr/lib/libjson-c.so.5.1.0
systemd 1096 buster mem REG 259,5 34424 7346252 /usr/lib/libargon2.so.1
systemd 1096 buster mem REG 259,5 585320 7346511 /usr/lib/libssl.so.1.1
systemd 1096 buster mem REG 259,5 399904 7346290 /usr/lib/libdevmapper.so.1.02
특정 파일을 사용하는 프로세스 보기
특정 파일을 사용하고 있는 프로세스의 자세한 정보를 볼 수 있다. 옵션 없이 파일의 경로를 지정하면 된다.
$ lsof /var/log/httpd/access_log
특정 디렉터리내 열린 파일 보기
특정 디렉터리 하위의 열린 파일을 표시하고 싶은 경우가 있다. +D 옵션 뒤에 디렉터리 경로를 명시하면 된다. 아래는 /tmp 디렉터리 밑에 열린 파일을 표시한다.
$ lsof +D /tmp
Port
특정 포트를 사용하는 프로세스 정보 보기
개인적으로 가장 많이 쓰는 명령어이다. -i 옵션뒤에 프로토콜과 포트를 명시해 주면 된다. 다음은 TCP 22번 포트(ssh)를 쓰는 프로세스의 정보를 출력한다.
$ lsof -i TCP:22
특정 명령어가 사용하는 포트
apache httpd 같은 경우 fork 하여 여러 개의 프로세스가 뜨게 된다. -c 옵션과 httpd 를 주면 httpd 가 오픈한 파일 정보를 출력한다.
$ lsof -c httpd
포트 범위 지정
TCP 포트 22 번 에서 80번 까지 출력
$ lsof -i TCP:22-80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME master 1349 root 12u IPv4 12888 0t0 TCP localhost:smtp (LISTEN) master 1349 root 13u IPv6 12890 0t0 TCP localhost:smtp (LISTEN) sshd 1550 root 3u IPv4 13931 0t0 TCP *:ssh (LISTEN) sshd 1550 root 4u IPv6 13933 0t0 TCP *:ssh (LISTEN) sshd 1895 root 3r IPv4 15005 0t0 TCP 192.168.152.131:ssh->192.168.152.1:55859 (ESTABLISHED) sshd 7316 root 3r IPv4 22126 0t0 TCP 192.168.152.131:ssh->192.168.152.1:57127 (ESTABLISHED) sshd 7320 lesstif 3u IPv4 22126 0t0 TCP 192.168.152.131:ssh->192.168.152.1:57127 (ESTABLISHED) httpd 7400 root 4u IPv6 22492 0t0 TCP *:http (LISTEN) httpd 7402 apache 4u IPv6 22492 0t0 TCP *:http (LISTEN) httpd 7403 apache 4u IPv6 22492 0t0 TCP *:http (LISTEN) httpd 7404 apache 4u IPv6 22492 0t0 TCP *:http (LISTEN) httpd 7405 apache 4u IPv6 22492 0t0 TCP *:http (LISTEN) httpd 7406 apache 4u IPv6 22492 0t0 TCP *:http (LISTEN) httpd 7407 apache 4u IPv6 22492 0t0 TCP *:http (LISTEN) httpd 7408 apache 4u IPv6 22492 0t0 TCP *:http (LISTEN) httpd 7409 apache 4u IPv6 22492 0t0 TCP *:http (LISTEN) sshd 7474 root 3r IPv4 22763 0t0 TCP 192.168.152.131:ssh->192.168.152.1:57197 (ESTABLISHED)
service name 대신 port 번호 표시
IANA 에 등록한 well known 포트는 /etc/services 에 지정되어 있으므로 서비스를 파악하기 용이하다. 하지만 자체 개발한 서비스가 /etc/services 에 등록된 포트를 사용할 경우에는 서비스 이름보다 포트 번호로 표시하는 게 낫다. -P 옵션을 사용하면 서비스 이름대신 포트 번호로 표시해 준다.
예로 java 로 서비스하고 있는 모든 listen 하는 포트를 표시하려면 아래 명령을 실행한다.
$ lsof -i TCP -P |grep java|grep LISTEN
IPv4 또는 IPv6 포트만 표시
-i 옵션 뒤에 4(IPv4), 또는 6(IPV6) 를 지정하여 특정 IP 의 버전만 확인할 수 있다./
$ lsof -i 4
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1068 rpc 6u IPv4 11858 0t0 UDP *:sunrpc rpcbind 1068 rpc 7u IPv4 11860 0t0 UDP *:819 rpcbind 1068 rpc 8u IPv4 11861 0t0 TCP *:sunrpc (LISTEN) rpc.statd 1086 rpcuser 5r IPv4 11949 0t0 UDP *:838 rpc.statd 1086 rpcuser 8u IPv4 11955 0t0 UDP *:47492 rpc.statd 1086 rpcuser 9u IPv4 11959 0t0 TCP *:38374 (LISTEN) cupsd 1159 root 7u IPv4 12195 0t0 TCP localhost:ipp (LISTEN)
TCP/UDP 포트 표시
-i 옵션은 모든 네트워크 포트를 표시한다. -i 뒤에 프로토콜을 명시하면 해당 프로토콜 관련 포트만 표시한다.
$ lsof -i
$ lsof -i TCP
$ lsof -i TCP
Filter
사용자 지정 옵션인 -u 에 ^를 추가하면 특정 사용자는 제외할 수 있다. 다음은 lesstif 와 root 사용자가 열은 파일은 제외하고 정보를 출력한다.
$ lsof -u^lesstif -u ^root
특정 프로세스가 오픈한 파일 표시
특정 프로세스가 오픈한 파일만 표시한다. -p(소문자) 옵션뒤에 PID 를 주면 된다.
$ lsof -p 123
특정 사용자가 오픈한 모든 프로세스 중지
-t 옵션은 자세한 정보를 출력하지 않고 pid 정보만 출력한다. 다음 명령은 lesstif 사용자로 구동한 프로세스의 id 를 리턴한다.
$ lsof -t -u lesstif
이를 응용하여 kill 명령어에 pid 만 전달할 수 있으므로 아래와 같이 사용하면 lesstif 사용자의 모든 프로세스를 중지하게 된다.
kill -KILL `lsof -t -u lesstif`
'IT' 카테고리의 다른 글
리눅스 bash 문자열 변수 조작 (자르기, 삭제, 치환) (4) | 2020.11.28 |
---|---|
python gtts 사용 법 (0) | 2020.11.21 |
로또 번호 발생기 안드로이드 앱 (1) | 2017.07.27 |
space engineer 스페이스 엔지니어 (0) | 2016.01.27 |
세비지2 화이트 스크린 버그 해결 (2) | 2015.08.02 |