天天看點

程序與檔案的關系--lsof

lsof指令

作用:

1.列出指定檔案被哪些程序打開(此處的檔案是廣義上的檔案,可以表示linux上的一切東西)

2.列出指定端口被哪些程序所占用

3.根據使用者或組來查詢程序

4.根據檔案描述符來查找程序

5.根據字元串來過濾程序

6.周遊某個目錄來查找程序

7.擴充:恢複誤删除的檔案

本文使用到的選項

-c:根據字元串來搜尋程序

-p:列出指定程序号所打開的檔案

-a:合并多個選項

-g:列出相應組的程序所打開的檔案

+d:列出指定目錄下所有檔案的打開情況

-n:不将ip轉換為hostname

-i:列出占用指定端口或協定的程序

本文拓展

怎樣恢複删除的檔案

選項及用法:

-c:根據字元串來搜尋程序

用法:
lsof -c string # 列出以字元串string開頭的指令所打開的檔案
~]# lsof -c sys   ##列出以sys開頭的程序,此輸出結果已被省略
~]# lsof -c redis  ##列出包含redis的程序
COMMAND    PID  USER   FD      TYPE             DEVICE  SIZE/OFF     NODE NAME
redis-ser 4233 redis  cwd       DIR              253,0        22 38780782 /var/lib/redis
redis-ser 4233 redis  rtd       DIR              253,0       288       64 /
redis-ser 4233 redis  txt       REG              253,0    975208    83904 /usr/bin/redis-server
redis-ser 4233 redis  mem       REG              253,0 106070960 33797329 /usr/lib/locale/locale-archive
redis-ser 4233 redis  mem       REG              253,0   2173512 33797336 /usr/lib64/libc-2.17.so
redis-ser 4233 redis  mem       REG              253,0    144792 33797370 /usr/lib64/libpthread-2.17.so
redis-ser 4233 redis  mem       REG              253,0    212096 38780776 /usr/lib64/libjemalloc.so.1
redis-ser 4233 redis  mem       REG              253,0     19776 33797342 /usr/lib64/libdl-2.17.so
redis-ser 4233 redis  mem       REG              253,0   1139680 33797345 /usr/lib64/libm-2.17.so
redis-ser 4233 redis  mem       REG              253,0    164240 33797328 /usr/lib64/ld-2.17.so
redis-ser 4233 redis    0r      CHR                1,3       0t0     5999 /dev/null
redis-ser 4233 redis    1u     unix 0xffff880015f48800       0t0    27946 socket
redis-ser 4233 redis    2u     unix 0xffff880015f48800       0t0    27946 socket
redis-ser 4233 redis    3u  a_inode                0,9         0     5995 [eventpoll]
redis-ser 4233 redis    4u     IPv4              28618       0t0      TCP node1.xjwlearn.com:6379 (LISTEN)

>>從輸出結果中我們可以檢視到包含redis字元串的所有程序資訊,包括程序号,使用者,inode号以及打開的檔案路徑等
           

-p:列出指定程序号所打開的檔案

用法:
lsof -p PID #列出程序号為PID的程序所打開的檔案
lsof -p PID1,PID2,...,PIDn
~]# lsof -p 4233 ##根據上面的結果我們知道redis的程序号為4233,此方式與上面的結果是完全一樣的
redis-ser 4233 redis  cwd       DIR              253,0        22 38780782 /var/lib/redis
redis-ser 4233 redis  rtd       DIR              253,0       288       64 /
redis-ser 4233 redis  txt       REG              253,0    975208    83904 /usr/bin/redis-server
redis-ser 4233 redis  mem       REG              253,0 106070960 33797329 /usr/lib/locale/locale-archive
redis-ser 4233 redis  mem       REG              253,0   2173512 33797336 /usr/lib64/libc-2.17.so
redis-ser 4233 redis  mem       REG              253,0    144792 33797370 /usr/lib64/libpthread-2.17.so
redis-ser 4233 redis  mem       REG              253,0    212096 38780776 /usr/lib64/libjemalloc.so.1
redis-ser 4233 redis  mem       REG              253,0     19776 33797342 /usr/lib64/libdl-2.17.so
redis-ser 4233 redis  mem       REG              253,0   1139680 33797345 /usr/lib64/libm-2.17.so
redis-ser 4233 redis  mem       REG              253,0    164240 33797328 /usr/lib64/ld-2.17.so
redis-ser 4233 redis    0r      CHR                1,3       0t0     5999 /dev/null
redis-ser 4233 redis    1u     unix 0xffff880015f48800       0t0    27946 socket
redis-ser 4233 redis    2u     unix 0xffff880015f48800       0t0    27946 socket
redis-ser 4233 redis    3u  a_inode                0,9         0     5995 [eventpoll]
redis-ser 4233 redis    4u     IPv4              28618       0t0      TCP node1.xjwlearn.com:6379 (LISTEN)
           

-a:合并多個選項

注意:-a的使用方式很簡單,隻需要在添加-a選項後陸續添加其他的幾個選項即可

~]# lsof -a -c redis  -u redis -d mem ##列出包含字元串redis并且檔案描述符為mem且使用者為redis的程序所打開的檔案
COMMAND    PID  USER  FD   TYPE DEVICE  SIZE/OFF     NODE NAME
redis-ser 4233 redis mem    REG  253,0 106070960 33797329 /usr/lib/locale/locale-archive
redis-ser 4233 redis mem    REG  253,0   2173512 33797336 /usr/lib64/libc-2.17.so
redis-ser 4233 redis mem    REG  253,0    144792 33797370 /usr/lib64/libpthread-2.17.so
redis-ser 4233 redis mem    REG  253,0    212096 38780776 /usr/lib64/libjemalloc.so.1
redis-ser 4233 redis mem    REG  253,0     19776 33797342 /usr/lib64/libdl-2.17.so
redis-ser 4233 redis mem    REG  253,0   1139680 33797345 /usr/lib64/libm-2.17.so
redis-ser 4233 redis mem    REG  253,0    164240 33797328 /usr/lib64/ld-2.17.so
           

-g:列出相應組的程序所打開的檔案

用法:
lsof -g GID  ##列出組号為GID的程序所打開的檔案
~]# lsof -g 1000 ##列出組号為1000的程序所打開的檔案
           

+d:列出指定目錄下所有檔案的打開情況

用法:
lsof +d directory
~]# lsof +d /etc
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF       NODE NAME
systemd     1 root   11r   REG    0,3        0 4026532025 /proc/swaps
lsof    10698 root    3r   DIR    0,3        0          1 /proc
           

注意:+d選項隻能列出目前目錄下的檔案,子目錄下的檔案是不會被列出的,如若需要周遊所有檔案,可以使用+D選項

-n與-i的組合使用:

-n:不将ip轉換為hostname

-i:列出占用指定端口或協定的程序

用法:
lsof -i:port:根據端口查詢
lsof -i tcp 查詢tcp連接配接
lsof -i udp 查詢udp連接配接
lsof -i tcp:22 查詢占用tcp22号端口的程序
[[email protected] fd]# lsof -i:22
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    4231 root    3u  IPv4  28632      0t0  TCP *:ssh (LISTEN)
sshd    4231 root    4u  IPv6  28634      0t0  TCP *:ssh (LISTEN)
sshd    7875 root    3u  IPv4 108289      0t0  TCP node1.xjwlearn.com:ssh->192.168.99.1:62006 (ESTABLISHED)
[[email protected] fd]# lsof -n -i:22
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    4231 root    3u  IPv4  28632      0t0  TCP *:ssh (LISTEN)
sshd    4231 root    4u  IPv6  28634      0t0  TCP *:ssh (LISTEN)
sshd    7875 root    3u  IPv4 108289      0t0  TCP 192.168.99.100:ssh->192.168.99.1:62006 (ESTABLISHED)
           

列出檔案或目錄被哪些程序所使用:

lsof filename
lsof directory
           

lsof恢複誤删除的檔案

場景描述:應用程式正在對輸出日志到檔案a.log,此時若執行rm -f a.log,則此檔案在系統中是不存在的,不能通過正常的指令去檢視檔案資訊和内容,但是資料還是存儲在磁盤。此時由于應用程序沒有釋放此檔案,是以可以通擷取此檔案的描述符來恢複檔案

~]# lsof deleted.filename   ##可顯示出PID,FD,NUMBER等參數,這些參數可唯一确定一個檔案,前提是此檔案正在被某個程序使用
~]# cat /proc/PID/fd/NUMBER > somefile  ##将已經删除的檔案重定向到somefile中
           

繼續閱讀