2021-05-12 14:32:11
Linux 利用lsof命令恢復刪除的檔案
2020-06-16 17:24:54
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://www.linuxidc.com/
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 (mockbuild@c6b8.bsys.dev.CentOS.org) (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 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 (mockbuild@c6b8.bsys.dev.centos.org) (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
再次提醒,恢復前提是這個進程必須存在。
本文永久更新連結地址:http://www.linuxidc.com/Linux/2016-12/138850.htm
相關文章