lsof命令
lsof命令用於檢視你程序開打的檔案,開啟檔案的程序,程序開啟的埠(tcp、udp)。找回/恢復刪除的檔案。是十分方便的系統監視工具,因為lsof命令需要訪問核心記憶體和各種檔案,所以需要root使用者執行。
在linux環境下,任何事物都以檔案的形式存在,通過檔案不僅僅可以訪問常規資料,還可以訪問網路連線和硬體。所以如傳輸控制協議 (tcp) 和使用者資料報協議 (udp) 套接字等,系統在後台都為該應用程式分配了乙個檔案描述符,無論這個檔案的本質如何,該檔案描述符為應用程式與基礎作業系統之間的互動提供了通用介面。因為應用程式開啟檔案的描述符列表提供了大量關於這個應用程式本身的資訊,因此通過lsof工具能夠檢視這個列表對系統監測以及排錯將是很有幫助的。
語法
lsof(選項)
引數
-a:列出開啟檔案存在的程序;
-c《程序名》:列出指定程序所開啟的檔案;
-g:列出gid號程序詳情;
-d《檔案號》:列出占用該檔案號的程序;
+d《目錄》:列出目錄下被開啟的檔案;
+d《目錄》:遞迴列出目錄下被開啟的檔案;
-n《目錄》:列出使用nfs的檔案;
-i《條件》:列出符合條件的程序。(4、6、協議、:埠、 @ip )
-p《程序號》:列出指定程序號所開啟的檔案;
-u:列出uid號程序詳情;
-h:顯示幫助資訊;
-v:顯示版本資訊。
使用
檢視lsof -i:(埠) 檢視這個埠有那些程序在訪問,比如22埠
shell> lsof -i:22command pid user
fd type device
size
/off
node
name
sshd 1939 root 3u ipv4 12317 0t0 tcp *:ssh (listen)
sshd 1939 root 4u ipv6 12321 0t0 tcp *:ssh (listen)
sshd 2790 root 3u ipv4 15229 0t0 tcp 192.168.178.128:ssh->192.168.178.1:64601 (established)
sshd 2824 root 3u ipv4 15528 0t0 tcp 192.168.178.128:ssh->192.168.178.1:64673 (established)
sshd 2990 root 3u ipv4 15984 0t0 tcp 192.168.178.128:ssh->192.168.178.1:64686 (established)
sshd 14695 root 3u ipv4 39558 0t0 tcp 192.168.178.128:ssh->192.168.178.1:49662 (established)
lsof輸出各列資訊的意義如下:
恢復檔案
利用lsof可以恢復一些系統日誌,前提是這個程序必須存在。這裡就拿最常用的/var/log/messages來舉例說明,大家在做測試的時候最好先備份一下。
#備份shell> cp /var/log/message /var/log/message_bacshell> lsof |grep /var/log/message
rsyslogd 1737 root 1w reg 8,2 5716123 652638 /var/log/messages
程序在執行中,接下來我就把/var/log/messages這個檔案刪掉
shell> rm /var/log/messages刪掉之後,我再來看看這個程序的變化
shell> lsof |grep /var/log/messagesrsyslogd 1737 root 1w reg 8,2 5716123 652638 /var/log/messages (deleted)
大家看到有變化了吧, 對比兩個之後發現多了(deleted)。要找到這個檔案在哪還要看看這個
pid:1737 fd:1 那我們有直接進入/proc/1737/fd/1用ll檢視一下
shell> cd /proc/1737/fd/shell> ll
total 0
lrwx------ 1 root root 64 dec 23 13:00 0 -> socket:[11442]
l-wx------ 1 root root 64 dec 23 13:00 1 -> /var/log/messages (deleted)
l-wx------ 1 root root 64 dec 23 13:00 2 -> /var/log/secure
lr-x------ 1 root root 64 dec 23 13:00 3 -> /proc/kmsg
l-wx------ 1 root root 64 dec 23 13:00 4 -> /var/log/maillog
看到了1對應/var/log/messages (deleted),看看檔案是不是我們要的檔案:
shell> head -5 1nov 14 03:11:11 localhost kernel: imklog 5.8.10, log source = /proc/kmsg started.
nov 14 03:11:11 localhost rsyslogd: [origin software="rsyslogd"
swversion=
"5.8.10"
x-pid=
"1241"
x-info=
""] start
nov 14 03:11:11 localhost kernel: initializing cgroup subsys cpuset
nov 14 03:11:11 localhost kernel: initializing cgroup subsys cpu
nov 14 03:11:11 localhost kernel: linux version 2.6.32-431.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (red hat 4.4.7-4) (gcc) ) #1 smp fri nov 22 03:15:09 utc 2013
對比備份檔案:
shell> head -5 /var/log/message_bacnov 14 03:11:11 localhost kernel: imklog 5.8.10, log source = /proc/kmsg started.
nov 14 03:11:11 localhost rsyslogd: [origin software="rsyslogd"
swversion=
"5.8.10"
x-pid=
"1241"
x-info=
""] start
nov 14 03:11:11 localhost kernel: initializing cgroup subsys cpuset
nov 14 03:11:11 localhost kernel: initializing cgroup subsys cpu
nov 14 03:11:11 localhost kernel: linux version 2.6.32-431.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (red hat 4.4.7-4) (gcc) ) #1 smp fri nov 22 03:15:09 utc 2013
對比發現資料是一樣的,恢復
shell> cat 1 > /var/log/messages再次提醒,恢復前提是這個程序必須存在。
Linux命令 lsof命令
lsof 是遵從unix 哲學的典範,它只做一件事情,並且做的相當完美 它可以列出某個程序開啟的所有檔案資訊。開啟的檔案可能是普通的檔案,目錄,nfs檔案,塊檔案,字元檔案,共享庫,常規管道,明明管道,符號鏈結,socket流,網路socket,unix域socket,以及其它更多。因為unix系統...
如何使用lsof命令恢復刪除的檔案
在linux檔案系統中,檔名實際是指向索引節點 inode 的鏈結。linux建立檔案系統後,就會生成inode表,inode索引節點會包含檔案的屬性 block塊的指標等資訊關於inode介紹看我這篇博文。當使用 rm 命令刪除某檔案時,只是刪除了指向inode索引節點的鏈結,但是沒有刪除inod...
Linux 中lsof 命令的使用
使用hexo時,本機以4000埠啟動server sh 3.2 hexo server info hexo is running at press ctrl c to stop.此時,4000埠被hexo占用,如果想檢視4000埠的占用情況,使用 sh 3.2 lsof i 4000 command...