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中