導航:首頁 > 操作系統 > linuxdeleted

linuxdeleted

發布時間:2024-02-22 15:05:05

linux lsof命令詳解

lsof(list open files)是一個列出當前系統打開文件的工具。在linux環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網路連接和硬體。所以如傳輸控制協議 (TCP) 和用戶數據報協議 (UDP) 套接字等,系統在後台都為該應用程序分配了一個文件描述符,無論這個文件的本質如何,該文件描述符為應用程序與基礎操作系統之間的交互提供了通用介面。因為應用程序打開文件的描述符列表提供了大量關於這個應用程序本身的信息,因此通過lsof工具能夠查看這個列表對系統監測以及排錯將是很有幫助的。

在終端下輸入lsof即可顯示系統打開的文件,因為 lsof 需要訪問核心內存和各種文件,所以必須以 root 用戶的身份運行它才能夠充分地發揮其功能。

直接輸入lsof部分輸出為:

每行顯示一個打開的文件,若不指定條件默認將顯示所有進程打開的所有文件。

lsof輸出各列信息的意義如下:

COMMAND:進程的名稱 PID:進程標識符

USER:進程所有者

FD:文件描述符,應用程序通過文件描述符識別該文件。如cwd、txt等 TYPE:文件類型,如DIR、REG等

DEVICE:指定磁碟的名稱

SIZE:文件的大小

NODE:索引節點(文件在磁碟上的標識)

NAME:打開文件的確切名稱

FD 列中的文件描述符cwd 值表示應用程序的當前工作目錄,這是該應用程序啟動的目錄,除非它本身對這個目錄進行更改,txt 類型的文件是程序代碼,如應用程序二進制文件本身或共享庫,如上列表中顯示的 /sbin/init 程序。

其次數值表示應用程序的文件描述符,這是打開該文件時返回的一個整數。如上的最後一行文件/dev/initctl,其文件描述符為 10。u 表示該文件被打開並處於讀取/寫入模式,而不是只讀 或只寫 (w) 模式。同時還有大寫 的W 表示該應用程序具有對整個文件的寫鎖。該文件描述符用於確保每次只能打開一個應用程序實例。初始打開每個應用程序時,都具有三個文件描述符,從 0 到 2,分別表示標准輸入、輸出和錯誤流。所以大多數應用程序所打開的文件的 FD 都是從 3 開始。

與 FD 列相比,Type 列則比較直觀。文件和目錄分別稱為 REG 和 DIR。而CHR 和 BLK,分別表示字元和塊設備;或者 UNIX、FIFO 和 IPv4,分別表示 UNIX 域套接字、先進先出 (FIFO) 隊列和網際協議 (IP) 套接字。

lsof語法格式是: lsof [options] filename

查找誰在使用文件系統

在卸載文件系統時,如果該文件系統中有任何打開的文件,操作通常將會失敗。那麼通過lsof可以找出那些進程在使用當前要卸載的文件系統,如下: # 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)的原因,以避免該守護進程阻止卸載不相關的文件系統。

恢復刪除的文件

當Linux計算機受到入侵時,常見的情況是日誌文件被刪除,以掩蓋攻擊者的蹤跡。管理錯誤也可能導致意外刪除重要的文件,比如在清理舊日誌時,意外地刪除了資料庫的活動事務日誌。有時可以通過lsof來恢復這些文件。 當進程打開了某個文件時,只要該進程保持打開該文件,即使將其刪除,它依然存在於磁碟中。這意味著,進程並不知道文件已經被刪除,它仍然可以向打開該文件時提供給它的文件描述符進行讀取和寫入。除了該進程之外,這個文件是不可見的,因為已經刪除了其相應的目錄索引節點。 在/proc 目錄下,其中包含了反映內核和進程樹的各種文件。/proc目錄掛載的是在內存中所映射的一塊區域,所以這些文件和目錄並不存在於磁碟中,因此當我們對這些文件進行讀取和寫入時,實際上是在從內存中獲取相關信息。大多數與 lsof 相關的信息都存儲於以進程的 PID 命名的目錄中,即 /proc/1234 中包含的是 PID 為 1234 的進程的信息。每個進程目錄中存在著各種文件,它們可以使得應用程序簡單地了解進程的內存空間、文件描述符列表、指向磁碟上的文件的符號鏈接和其他系統信息。lsof 程序使用該信息和其他關於內核內部狀態的信息來產生其輸出。所以lsof 可以顯示進程的文件描述符和相關的文件名等信息。也就是我們通過訪問進程的文件描述符可以找到該文件的相關信息。 當系統中的某個文件被意外地刪除了,只要這個時候系統中還有進程正在訪問該文件,那麼我們就可以通過lsof從/proc目錄下恢復該文件的內容。 假如由於誤操作將/var/log/messages文件刪除掉了,那麼這時要將/var/log/messages文件恢復的方法如下: 首先使用lsof來查看當前是否有進程打開/var/logmessages文件,如下: # 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 ([email protected]) (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 對於許多應用程序,尤其是日誌文件和資料庫,這種恢復刪除文件的方法非常有用。

可以列出被 進程 打開 文件 的信息。被打開的文件可以是

1.普通的文件,2.目錄 3.網路文件系統的文件,4.字元設備文件 5.(函數)共享庫 6.管道,命名管道 7.符號鏈接

8.底層的socket字流,網路socket, unix 域名socket

9.在 linux 裡面,大部分的東西都是被當做文件的…..還有其他很多

怎樣使用lsof

這里主要用案例的形式來介紹lsof 命令的 使用

1.列出所有打開的文件:

lsof

備注: 如果不加任何參數,就會打開所有被打開的文件,建議加上一下參數來具體定位

2. 查看 誰正在使用某個文件

lsof /filepath/file

3.遞歸查看某個目錄的文件信息

lsof +D /filepath/filepath2/

備注: 使用了+D,對應目錄下的所有子目錄和文件都會被列出

4. 比使用+D選項,遍歷查看某個目錄的所有文件信息 的方法

lsof | grep 『/filepath/filepath2/』

5. 列出某個用戶打開的文件信息

lsof -u username

備注: -u 選項,u其實是user的縮寫

6. 列出某個程序所打開的文件信息

lsof -c mysql

備注: -c 選項將會列出所有以mysql開頭的程序的文件,其實你也可以寫成 lsof | grep mysql, 但是第一種方法明顯比第二種方法要少打幾個字元了

7. 列出多個程序多打開的文件信息

lsof -c mysql -c apache

8. 列出某個用戶以及某個程序所打開的文件信息

lsof -u test -c mysql

9. 列出除了某個用戶外的被打開的文件信息

lsof -u ^root

備註:^這個符號在用戶名之前,將會把是root用戶打開的進程不讓顯示

10. 通過某個進程號顯示該進行打開的文件

lsof -p 1

11. 列出多個進程號對應的文件信息

lsof -p 123,456,789

12. 列出除了某個進程號,其他進程號所打開的文件信息

lsof -p ^1

13 . 列出所有的網路連接

lsof -i

14. 列出所有tcp 網路連接信息

lsof -i tcp

15. 列出所有udp網路連接信息

lsof -i udp

16. 列出誰在使用某個埠

lsof -i :3306

17. 列出誰在使用某個特定的udp埠

lsof -i udp:55

特定的tcp埠

lsof -i tcp:80

18. 列出某個用戶的所有活躍的網路埠

lsof -a -u test -i

19. 列出所有網路文件系統

lsof -N

20.域名socket文件

lsof -u

21.某個用戶組所打開的文件信息

lsof -g 5555

22. 根據文件描述列出對應的文件信息

lsof -d description(like 2)

23. 根據文件描述范圍列出文件信息

lsof -d 2-3

實用命令

② linux中文件句柄未釋放,會導致什麼問題

linux刪除文件後沒有釋放空間

今天發現一台伺服器的home空間滿了,於是要清空沒用的文件,當我刪除文件後,發現可用空間沒有變化

os:centos4.7

現象:

發現當前磁碟空間使用情況:

[root@ticketb ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 981M 203M 729M 22% /
none 16G 0 16G 0% /dev/shm
/dev/sda9 2.9G 37M 2.7G 2% /tmp
/dev/sda7 4.9G 1.9G 2.7G 42% /usr
/dev/sda8 2.9G 145M 2.6G 6% /var
/dev/mapper/vghome-lvhome
20G 19G 11M 100% /home
/dev/mapper/vgoradata-lvoradata
144G 48G 90G 35% /u01/oradata
/dev/mapper/vgbackup-lvbackup
193G 7.8G 175G 5% /u01/backup

通過以下的命令找到沒用的文件,然後刪除

[root@ticketb ~]# find /home/oracle/admin/dbticb/ump/ -name "dbticb_*.trc" -mtime +50 | xargs rm -rf

然後在查看磁碟空間使用情況,發現沒有/home空間沒有變化

[root@ticketb ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 981M 203M 729M 22% /
none 16G 0 16G 0% /dev/shm
/dev/sda9 2.9G 37M 2.7G 2% /tmp
/dev/sda7 4.9G 1.9G 2.7G 42% /usr
/dev/sda8 2.9G 145M 2.6G 6% /var
/dev/mapper/vghome-lvhome
20G 19G 11M 100% /home
/dev/mapper/vgoradata-lvoradata
144G 48G 90G 35% /u01/oradata
/dev/mapper/vgbackup-lvbackup
193G 7.8G 175G 5% /u01/backup

這個郁悶啊,明明刪除文件了,怎麼空間沒有被釋放啊,rm命令應該是直接刪除啊,在查看下/home下還有什麼佔用空間

[root@ticketb ~]# -h --max-depth=1 /home
16K /home/lost+found
2.6G /home/oracle
2.6G /home

可這里顯示空間已經釋放了啊,於是google下,

未釋放磁碟空間原因:

在Linux或者Unix系統中,通過rm或者文件管理器刪除文件將會從文件系統的文件夾結構上解除鏈接(unlink).然而假設文件是被
打開的(有一個進程正在使用),那麼進程將仍然能夠讀取該文件,磁碟空間也一直被佔用。而我刪除的是oracle的告警log文件
刪除的時候文件應該正在被使用

解決方法

首先獲得一個已經被刪除可是仍然被應用程序佔用的文件列表,例如以下所看到的:

[root@ticketb ~]# lsof |grep deleted
oracle 12639 oracle 5w REG 253,0 648 215907 /home/oracle/admin/dbticb/ump/dbticb_ora_12637.trc (deleted)
oracle 12639 oracle 6w REG 253,0 16749822091 215748 /home/oracle/admin/dbticb/bmp/alert_dbticb.log (deleted)
oracle 12639 oracle 7u REG 253,0 0 36282 /home/oracle/oracle/proct/10.2.0/db_1/dbs/lkinstdbticb (deleted)
oracle 12639 oracle 8w REG 253,0 16749822091 215748 /home/oracle/admin/dbticb/bmp/alert_dbticb.log (deleted)
oracle 12641 oracle 5w REG 253,0 648 215907 /home/oracle/admin/dbticb/ump/dbticb_ora_12637.trc (deleted)
oracle 12641 oracle 6w REG 253,0 16749822091 215748 /home/oracle/admin/dbticb/bmp/alert_dbticb.log (deleted)



oracle 23492 oracle 6w REG 253,0 16749822091 215748 /home/oracle/admin/dbticb/bmp/alert_dbticb.log (deleted)
oracle 23492 oracle 7u REG 253,0 0 36282 /home/oracle/oracle/proct/10.2.0/db_1/dbs/lkinstdbticb (deleted)
oracle 23492 oracle 8w REG 253,0 16749822091 215748 /home/oracle/admin/dbticb/bmp/alert_dbticb.log (deleted)
oracle 23494 oracle 10u REG 253,0 0 36307 /home/oracle/oracle/proct/10.2.0/db_1/dbs/lkinstrmandb (deleted)

從輸出結果能夠看到/home/oracle/admin/dbticb/bmp/alert_dbticb.log還被使用,未被釋放空間

怎樣讓進程釋放呢?

一種方法是kill掉相應的進程,或者停掉使用這個文件的應用,讓os自己主動回收磁碟空間
我這個環境有非常多進程在使用的這個文件,停掉進程有點麻煩,再有就是風險非常大

當linux打開一個文件的時候,Linux內核會為每個進程在/proc/ 『/proc/nnnn/fd/文件夾(nnnn為pid)』建立一個以其pid
為名的文件夾用來保存進程的相關信息,而其子文件夾fd保存的是該進程打開的全部文件的fd(fd:file descriptor)。
kill進程是通過截斷proc文件系統中的文件能夠強制要求系統回收分配給正在使用的的文件。
這是一項高級技術,僅到管理員確定不會對執行中的進程造成影響時使用。應用程序對這樣的方
式支持的並不好,當一個正在使用的文件被截斷可能會引發不可預知的問題

所以我還是採用停應用來解決

restart oracle資料庫,發現/home/oracle/admin/dbticb/bmp/alert_dbticb.log相應的空間被釋放

在查看磁碟空間的使用情況,發現空間已經回收了

[root@ticketb ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 981M 203M 729M 22% /
none 16G 0 16G 0% /dev/shm
/dev/sda9 2.9G 37M 2.7G 2% /tmp
/dev/sda7 4.9G 1.9G 2.7G 42% /usr
/dev/sda8 2.9G 145M 2.6G 6% /var
/dev/mapper/vghome-lvhome
20G 2.6G 16G 15% /home
/dev/mapper/vgoradata-lvoradata
144G 48G 90G 35% /u01/oradata
/dev/mapper/vgbackup-lvbackup
193G 7.8G 175G 5% /u01/backup

ok,問題解決,然後做下收尾工作就可以

-------------------------------------------------------------------------------------------------

學習下lsof命令

lsof全名list opened files,也就是列舉系統中已經被打開的文件。我們都知道,linux環境中,不論什麼事物都是文件,
設備是文件,文件夾是文件,甚至sockets也是文件。所以,用好lsof命令,對日常的linux管理非常有幫助。

lsof是linux最常常使用的命令之中的一個,通常的輸出格式為:

引用
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

③ Linux裡面unset A命令作用是什麼

Linux unset命令:



功能說明:unset是一個內建的Unix shell命令,在Bourne shell家族(sh、ksh、bash等)和C shell家族(csh、tcsh等)都有實現。它可以取消設置一個shell變數,從內存和shell的導出環境中刪除它。它實現為一個殼層內建指令,因為它直接操縱shell的內部。

只讀shell變數不能被unset。如果試圖unset只讀變數,unset命令將列印一個錯誤消息,並返回一個非零的退出代碼。

This command removes one or more variables. Each name is a variable name, specified in any of the ways acceptable to the set command. If a name refers to an element of an array then that element is removed without affecting the rest of the array. If a name consists of an array name with no parenthesized index, then the entire array is deleted. The unset command returns an empty string as result. An error occurs if any of the variables doesn't exist, and any variables after the non-existent one are not deleted.

語法:

unset [-fv][變數或函數名稱]

補充說明:unset為shell內建指令,可刪除變數或函數。

④ linux伺服器磁碟滿了怎麼辦

1、遇到磁碟空間不足的報錯時候,首先使用df-h查看磁碟空間使用情況,找到空間達到100%的世搭棗目錄磁碟。

2、進入該目錄,查找磁碟空間中的大文件,使用命枝坦令-sh*查找佔用空間大的目錄,通過逐層定位,最後找到具體的文件。

3、如果是久遠的log文件,一般是用不到的,可根據自己的情況刪除,通過下述命令刪除該文件夾下指定天數之前的文件:

find.-mtime+5-typef-name"*"-execrm-f{};

完成上述操作後,可釋放掉部分存儲空間。

4、除了磁碟空間除了文件佔用之外,還有一種情況,當磁碟空間滿了之後,我們無法查找到大文件,此時可能是文件可能已經被刪掉,但有進程依然在使用它。在進程運行期間,Linux不會釋放該文件的存儲空間。

5、此時適用命令lsof|lsof|grepdeleted查找到佔用的進程,直接停止進程或者kill掉就可以釋放空間(註:如果不是生產環境,重啟操作系統,空間也會釋搜拆放)

閱讀全文

與linuxdeleted相關的資料

熱點內容
怎麼進入電腦板2b2t伺服器 瀏覽:282
idea編譯進度條 瀏覽:132
文件夾工具箱軟體 瀏覽:686
最近為什麼手機連不上索尼伺服器 瀏覽:877
海康錄像機怎麼關視頻加密 瀏覽:786
編程以後有可能被機器人代替嗎 瀏覽:522
windows創建文件命令 瀏覽:986
linuxcopy文件內容 瀏覽:383
程序員帥哥禿頂 瀏覽:839
阿里雲伺服器開通流程 瀏覽:105
如何開雲伺服器 瀏覽:979
網站小說源碼 瀏覽:302
php用什麼ide 瀏覽:867
網上預約課程app哪個好 瀏覽:153
android兼容測試工具 瀏覽:97
雲伺服器不支持虛擬化怎麼辦 瀏覽:190
加密方式的演變 瀏覽:364
java常用演算法pdf 瀏覽:735
伺服器數據遇到異常什麼原因 瀏覽:452
phpexif信息 瀏覽:544