documentation 여기서 설명하는 것 이상으로 유용한 command 및 lsof
에서 출력하는 정보에 대한 내용이 써져 있으니 궁금하면 찾아보자.
process들이 열고 있는 file들을 찾는데 사용한다. 현 directory의 file들을 나열하는 ls
command와 헷갈리지 말자
파일을 누가 사용하고 있는건지 파악할때, 모르는 process가 무슨 짓거리를 하고 있는지 파악할때 등에 쓰인다. malicious attack을 탐지하는데 활용이 될 수 있다.
$ lsof
COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd unknown /proc/1/cwd (readlink: Permission denied)
init 1 root rtd unknown /proc/1/root (readlink: Permission denied)
init 1 root txt unknown /proc/1/exe (readlink: Permission denied)
init 1 root NOFD /proc/1/fd (opendir: Permission denied)
init 1 7 init root cwd unknown /proc/1/task/7/cwd (readlink: Permission denied)
init 1 7 init root rtd unknown /proc/1/task/7/root (readlink: Permission denied)
init 1 7 init root txt unknown /proc/1/task/7/exe (readlink: Permission denied)
init 1 7 init root NOFD /proc/1/task/7/fd (opendir: Permission denied)
init 12 root cwd unknown /proc/12/cwd (readlink: Permission denied)
init 12 root rtd unknown /proc/12/root (readlink: Permission denied)
init 12 root txt unknown /proc/12/exe (readlink: Permission denied)
init 12 root NOFD /proc/12/fd (opendir: Permission denied)
init 13 root cwd unknown /proc/13/cwd (readlink: Permission denied)
init 13 root rtd unknown /proc/13/root (readlink: Permission denied)
init 13 root txt unknown /proc/13/exe (readlink: Permission denied)
init 13 root NOFD /proc/13/fd (opendir: Permission denied)
sh 14 sycho cwd DIR 0,47 4096 6192449488238263 /mnt/c/Users/Seiyeon Cho/AppData/Local/Programs/Microsoft VS Code
sh 14 sycho rtd DIR 8,16 4096 2 /
sh 14 sycho txt REG 8,16 125688 1328 /usr/bin/dash
sh 14 sycho mem REG 8,16 2216304 6521 /usr/lib/x86_64-linux-gnu/libc.so.6
sh 14 sycho mem REG 8,16 240936 6325 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
sh 14 sycho 0r FIFO 0,11 0t0 17431 pipe
...
COMMAND : 해당 행 관련 process의 command의 첫 9글자
PID : 해당 행 관련 process의 ID
TID : 해당 행 관련 task(thread)의 ID
TASKCMD : 해당 행 관련 task(thread)의 command. 보통 process의 command, 즉 COMMAND와 동일한데 다를 때도 있다.
USER : process 소유 user ID
FD : file descriptor. FD 숫자이거나 특정 character 모음일수 있다.
r
, w
, u
를 통해 FD 관련 권한이 붙을 수 있다. (read, write, both)TYPE : file의 종류
DEVICE : 파일 형식이 뭐냐에 따라 다른데, 일단 DIR, REG, CHR의 경우 device number을 알려준다.
SIZE/OFF : file size 혹은 file offset을 알려준다. 단위는 byte.
NODE : 역시나 file 형식에 따라 다른데, 일반적으로 local file의 file system 상의 node number을 지칭한다. 즉 일반적으로 file의 metadata를 보유하는 inode의 number을 보유한다고 생각하면 된다. 뭔소린지 모르면 이 글을 참고하자.
NAME : file이 존재하는 file system / mount point의 이름이다.
-u
$ lsof -u sycho
-i
이 command의 경우, 파일과 관련된 네트워크 연결의 server/client측 ip 주소와 port number까지 확인이 가능하다(!). 해당 정보는 NAME
column에 나온다.
특정 protocol과 port 연결과 관련된 file들을 파악할 때 쓰인다. 밑은 22 port의 TCP 연결에서 열고 있는 파일들을 출력한다.
$ lsof -i TCP:22
$ lsof -i 4
$ lsof -i 6
$ lsof -i TCP:1-1024
$ lsof -i
^
$ lsof -i -u^root
-p
$ lsof -p 1
-c
lsof
command를 수행하는(...) process들이 접근하는 file들을 알려준다.$lsof -c lsof
$ kill -9 `lsof -t -u sycho`
grep
command랑 함께 활용하면, 출력물 내에서 특정 문자열이 포함된 녀석만을 손쉽게 찾는 것이 가능하다. 이를 활용해서 위의 option이랑 같은 역할의 command를 option을 외우지 않아도 수행하는게 가능하다. 예를들어 밑의 경우 lsof
출력물 중 sycho
가 등장한 항목만 출력하기에, -u
와 비슷한 역할을 한다고 볼 수 있다. 완전히 동일하진 않은게, 경로에 sycho
가 있으면 그것도 출력하기 때문... 참고로 |
은 pipe라고 불리는데 이게 뭔지 모르면 다음 글 참고. 그래도 정확한 출력을 원하면 option을 사용하도록 하자.$ lsof | grep "sycho"
wc
command는 파일 내 단어 개수를 파악하는데 사용된다. 여기에 -l
option을 사용할 경우 파일의 줄 개수를 파악하는게 가능한데, pipe를 활용해서 lsof의 출력물의 줄/단어 개수를 파악하는 것도 가능하다. 다만 유의할게 맨 처음에 header line도 개수에 포함한다는 것이다.$ lsof | wc -l
2207
/dev
하위 파일들 중 열려 있는 모든 파일들을 출력한다.$ lsof /dev
lsof
를 실행한 user이 볼 수 있는 권한이 없으면 관련 정보는 출력이 되지 않는다. sudo
를 통해 위의 wc
command 응용을 통해 이를 확인하는 것이 가능하다.$ lsof | wc -l
2207
$ sudo lsof | wc -l
[sudo] password for sycho:
2430
참고 영상
Learn Linux TV : Linux Crash Course - The lsof Command