lsof(list open files)是一個列出當前系統打開文件的工具。在linux環境下,任何事物都以文件的形式存在,經過文件不只僅能夠訪問常規數據,還能夠訪問網絡鏈接和硬件。因此如傳輸控制協議 (TCP) 和用戶數據報協議 (UDP) 套接字等,系統在後臺都爲該應用程序分配了一個文件描述符,不管這個文件的本質如何,該文件描述符爲應用程序與基礎操做系統之間的交互提供了通用接口。由於應用程序打開文件的描述符列表提供了大量關於這個應用程序自己的信息,所以經過lsof工具可以查看這個列表對系統監測以及排錯將是頗有幫助的。 linux
注:Redhat系和Ubuntu系可分別用yum和apt-get來安裝
centos
#yum install lsof
ubuntu
#apt-get install lsof
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root cwd DIR 3,3 1024 2 / init 1 root rtd DIR 3,3 1024 2 / init 1 root txt REG 3,3 38432 1763452 /sbin/init init 1 root mem REG 3,3 106114 1091620 /lib/libdl-2.6.so init 1 root mem REG 3,3 7560696 1091614 /lib/libc-2.6.so init 1 root mem REG 3,3 79460 1091669 /lib/libselinux.so.1 init 1 root mem REG 3,3 223280 1091668 /lib/libsepol.so.1 init 1 root mem REG 3,3 564136 1091607 /lib/ld-2.6.so init 1 root 10u FIFO 0,15 1309 /dev/initctl在終端下輸入lsof便可顯示系統打開的文件,由於 lsof 須要訪問核心內存和各類文件,因此必須以 root 用戶的身份運行它纔可以充分地發揮其功能。
COMMAND:進程的名稱 PID:進程標識符 USER:進程全部者 FD:文件描述符,應用程序經過文件描述符識別該文件。如cwd、txt等 TYPE:文件類型,如DIR、REG等 DEVICE:指定磁盤的名稱 SIZE:文件的大小 NODE:索引節點(文件在磁盤上的標識) NAME:打開文件的確切名稱其中FD 列中的文件描述符cwd 值表示應用程序的當前工做目錄,這是該應用程序啓動的目錄,除非它自己對這個目錄進行更改。
lsof [options] filename
lsof filename 顯示打開指定文件的全部進程 lsof -a 表示兩個參數都必須知足時才顯示結果 lsof -c string 顯示COMMAND列中包含指定字符的進程全部打開的文件 lsof -u username 顯示所屬user進程打開的文件 lsof -g gid 顯示歸屬gid的進程狀況 lsof +d /DIR/ 顯示目錄下被進程打開的文件 lsof +D /DIR/ 同上,可是會搜索目錄下的全部目錄,時間相對較長 lsof -d FD 顯示指定文件描述符的進程 lsof -n 不將IP轉換爲hostname,缺省是不加上-n參數 lsof -i 用以顯示符合條件的進程狀況 lsof -i[46] [protocol][@hostname|hostaddr][:service|port] 46 --> IPv4 or IPv6 protocol --> TCP or UDP hostname --> Internet host name hostaddr --> IPv4地址 service --> /etc/service中的 service name (能夠不僅一個) port --> 端口號 (能夠不僅一個)例如: 查看22端口如今運行的狀況
# lsof -i :22 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME sshd 1409 root 3u IPv6 5678 TCP *:ssh (LISTEN)查看所屬root用戶進程所打開的文件類型爲txt的文件:
# lsof -a -u root -d txt COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root txt REG 3,3 38432 1763452 /sbin/init mingetty 1632 root txt REG 3,3 14366 1763337 /sbin/mingetty mingetty 1633 root txt REG 3,3 14366 1763337 /sbin/mingetty mingetty 1634 root txt REG 3,3 14366 1763337 /sbin/mingetty mingetty 1635 root txt REG 3,3 14366 1763337 /sbin/mingetty mingetty 1636 root txt REG 3,3 14366 1763337 /sbin/mingetty mingetty 1637 root txt REG 3,3 14366 1763337 /sbin/mingetty kdm 1638 root txt REG 3,3 132548 1428194 /usr/bin/kdm X 1670 root txt REG 3,3 1716396 1428336 /usr/bin/Xorg kdm 1671 root txt REG 3,3 132548 1428194 /usr/bin/kdm startkde 2427 root txt REG 3,3 645408 1544195 /bin/bash ... ...
# lsof /GTES11/ COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME bash 4208 root cwd DIR 3,1 4096 2 /GTES11/ vim 4230 root cwd DIR 3,1 4096 2 /GTES11/在這個示例中,用戶root正在其/GTES11目錄中進行一些操做。一個 bash是實例正在運行,而且它當前的目錄爲/GTES11,另外一個則顯示的是vim正在編輯/GTES11下的文件。要成功地卸載/GTES11,應該在通知用戶以確保狀況正常以後,停止這些進程。 這個示例說明了應用程序的當前工做目錄很是重要,由於它仍保持着文件資源,而且能夠防止文件系統被卸載。這就是爲何大部分守護進程(後臺進程)將它們的目錄更改成根目錄、或服務特定的目錄(如 sendmail 示例中的 /var/spool/mqueue)的緣由,以免該守護進程阻止卸載不相關的文件系統。
# lsof |grep /var/log/messages syslogd 1283 root 2w REG 3,3 5381017 1773647 /var/log/messages (deleted)從上面的信息能夠看到 PID 1283(syslogd)打開文件的文件描述符爲 2。同時還能夠看到/var/log/messages已經標記被刪除了。所以咱們能夠在 /proc/1283/fd/2 (fd下的每一個以數字命名的文件表示進程對應的文件描述符)中查看相應的信息,以下:
# head -n 10 /proc/1283/fd/2 Aug 4 13:50:15 holmes86 syslogd 1.4.1: restart. Aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started. Aug 4 13:50:15 holmes86 kernel: Linux version 2.6.22.1-8 (root@everestbuilder.linux-ren.org) (gcc version 4.2.0) #1 SMP Wed Jul 18 11:18:32 EDT 2007 Aug 4 13:50:15 holmes86 kernel: BIOS-provided physical RAM map: Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000000000 - 000000000009f000 (usable) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000100000 - 000000001f7d3800 (usable) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000001f7d3800 - 0000000020000000 (reserved) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000e0000000 - 00000000f0007000 (reserved) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000f0008000 - 00000000f000c000 (reserved)從上面的信息能夠看出,查看 /proc/8663/fd/15 就能夠獲得所要恢復的數據。若是能夠經過文件描述符查看相應的數據,那麼就可使用 I/O 重定向將其複製到文件中,如:
cat /proc/1283/fd/2 > /var/log/messages對於許多應用程序,尤爲是日誌文件和數據庫,這種恢復刪除文件的方法很是有用。