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:22
command 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輸出各列資訊的意義如下:
command:程序的名稱
pid:程序辨別符
user:程序所有者
fd:檔案描述符,應用程式通過檔案描述符識别該檔案。如cwd、txt等
type:檔案類型,如dir、reg等
device:指定磁盤的名稱
size:檔案的大小
node:索引節點(檔案在磁盤上的辨別)
name:打開檔案的确切名稱
恢複檔案
利用lsof可以恢複一些系統日志,前提是這個程序必須存在。這裡就拿最常用的/var/log/messages來舉例說明,大家在做測試的時候最好先備份一下。
#備份shell> cp /var/log/message /var/log/message_bac
http://embeddedlinux.org.cn/
shell> 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/messages
rsyslogd 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 1
nov 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="http://www.rsyslog.com"] 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_bac
對比發現資料是一樣的,恢複
shell> cat 1 > /var/log/messages
再次提醒,恢複前提是這個程序必須存在。
本文作者:佚名
來源:51cto