天天看點

Linux下檢視程序打開的檔案與打開檔案的程序

有許多情況下,我們需要檢視一個程序目前打開了哪些檔案,反過來我們也希望知道某一個檔案正在被哪些程序所讀寫。在Linux下有許多有用的工具可以幫我們完成這兩個工作,下面介紹這兩個工具:lsof與fuser。

    fuser (find files or sockets' user)

    格式:fuser [選項] fname

    -k 如果找到打開檔案的程序,則發送SIGKILL殺死此程序,通過-i選項,可以為使用者提供互動選擇

    -signal 使用者可以指定使用何種信号去kill程序,如果-k參數指定,則忽略此參數

    -m 如果指定一個檔案,則所有通路那個檔案所在檔案系統的程序都會被列出來

    -n  type 指定不同的檔案類型,預設類型為file,此外還支援tcp和udp類型,此時可以簡寫作port/tcp

    -u  顯示程序屬主

    -v  顯示詳細程序與打開檔案資訊

    -4/-6 隻搜尋IPv4/IPv6套接字

    例如,我們想檢視端口TCP端口9000由哪個程序打開 fuser -v -u 9000/tcp

       檢視哪些程序在通路/home挂載分區        fuser -mv /home

    lsof (list open file)

    格式:lsof  [選項] [names]

    單獨執行lsof将輸出系統中所有打開的檔案,我們可以grep過濾出我們關心的内容,不過lsof提供了相應的參數幫助我們精确查找

    lsof name 将輸出所有使用檔案name的程序

    -p pid 列出程序pid所打開的所有檔案

    -d FD_pattern 列出所有已經打開的FD值為FD_pattern的檔案FD的值有整數,TXT,MEM等等

    -a lsof後可以加多個比對條件,預設為or連接配接,此參數将多個條件變成and關系

    -i [46] [proto] [@hostname|ip][:service|port] 用來選擇占用某個端口的程序

    +d/+D dir 非遞歸或遞歸的顯示打開dir下檔案的程序

    -c string   顯示程序的command中包含string的程序所打開的檔案

    -u username 顯示屬于user的程序所打開的檔案

    -g gid

     以上這些參數已經足夠用了,上面這兩個工具都是讀取/proc檔案系統中的資料進行工作的。網上有提到借助于lsof的查找功能,可以對一個删除的檔案進行恢複,前提是占用這個檔案的程序目前還沒有關閉。通過被删除的檔案,找到對應的程序及在程序中的fd-num,然後通過cat /proc/process-num/fd/fd-num即可恢複被删除的檔案。

本文轉自 goldfishe 51CTO部落格,原文連結:http://blog.51cto.com/jack88/1907999

繼續閱讀