fuser
有的時候我想要知道我的程式到底在這次啟動過程中開啟了多少檔案,可以利用 fuser 來觀察啦! 舉例來說,你如果卸載時發現系統通知:『 device is busy 』,那表示這個檔案系統正在忙碌中, 表示有某支程式有利用到該檔案系統啦!那麼你就可以利用 fuser 來追蹤羅!fuser 文法有點像這樣:
[root@www ~]# fuser [-umv] [-k [i] [-signal]] file/dir選項與參數:-u :除了程式的 PID 之外,同時列出該程式的擁有者;-m :後面接的那個檔名會主動的上提到該檔案系統的最頂層,對 umount 不成功很有效!-v :可以列出每個檔案與程式還有命令的完整相關性!-k :找出使用該檔案/目錄的 PID ,並試圖以 SIGKILL 這個訊號給予該 PID;-i :必須與 -k 配合,在刪除 PID 之前會先詢問使用者意願!-signal:例如 -1 -15 等等,若不加的話,預設是 SIGKILL (-9) 羅!範例一:找出目前所在目錄的使用 PID/所屬帳號/許可權 為何?[root@www ~]# fuser -uv . USER PID ACCESS COMMAND.: root 20639 ..c.. (root)bash
看到輸出的結果沒?他說『.』底下有個 PID 為 20639 的程式,該程式屬於 root 且命令為 bash 。 比較有趣的是那個 ACCESS 的項目,那個項目代表的意義為:
- c :此程式在當前的目錄下(非次目錄);
- e :可被觸發為運行狀態;
- f :是一個被開啟的檔案;
- r :代表頂層目錄 (root directory);
- F :該檔案被開啟了,不過在等待回應中;
- m :可能為分享的動態函式庫;
那如果你想要查閱某個檔案系統底下有多少程式正在佔用該檔案系統時,那個 -m 的選項就很有協助了! 鳥哥的測試主機僅有分割出 /, /boot, /home ,所以無法進行測試。不過好在還有個 /proc 的虛擬檔案系統, 讓我們來瞭解一下這個 /proc 的檔案系統有多少程式正在利用他吧!
範例二:找到所有使用到 /proc 這個檔案系統的程式吧![root@www ~]# fuser -uv /proc# 不會顯示任何資料,因為沒有任何程式會去使用 /proc 這個目錄啊!# 會被用到的是 /proc 底下的檔案啦!所以你應該要這樣做:[root@www ~]# fuser -mvu /proc USER PID ACCESS COMMAND/proc: root 4289 f.... (root)klogd root 4555 f.... (root)acpid haldaemon 4758 f.... (haldaemon)hald root 4977 F.... (root)Xorg# 有這幾支程式在進行 /proc 檔案系統的存取喔!這樣清楚了嗎?
既然可以針對整個檔案系統,那麼能不能僅針對單一檔案啊?當然可以羅!看一下底下的案例先:
範例三:找到 /var 底下屬於 FIFO 類型的檔案,並且找出存取該檔案的程式[root@www ~]# find /var -type p/var/gdm/.gdmfifo <==我們針對這玩意即可!/var/run/autofs.fifo-misc/var/run/autofs.fifo-net[root@www ~]# fuser -uv /var/gdm/.gdmfifo USER PID ACCESS COMMAND/var/gdm/.gdmfifo: root 4892 F.... (root)gdm-binary範例四:同範例三,但試圖刪除該 PID?且『不要』刪除喔![root@www ~]# fuser -ki /var/gdm/.gdmfifo/var/gdm/.gdmfifo: 4892Kill process 4892 ? (y/N) n
如何?很有趣的一個命令吧!透過這個 fuser 我們可以找出使用該檔案、目錄的程式,藉以觀察的啦! 他的重點與 ps, pstree 不同。 fuser 可以讓我們瞭解到某個檔案 (或檔案系統) 目前正在被哪些程式所利用!
lsof
相對於 fuser 是由檔案或者裝置去找出使用該檔案或裝置的程式,反過來說, 如何查出某個程式開啟或者使用的檔案與裝置呢?呼呼!那就是使用 lsof 羅~
[root@www ~]# lsof [-aUu] [+d]選項與參數:-a :多項資料需要『同時成立』才顯示出結果時!-U :僅列出 Unix like 系統的 socket 檔案類型;-u :後面接 username,列出該使用者相關程式所開啟的檔案;+d :後面接目錄,亦即找出某個目錄底下已經被開啟的檔案!範例一:列出目前系統上面所有已經被開啟的檔案與裝置:[root@www ~]# lsofCOMMAND PID USER FD TYPE DEVICE SIZE NODE NAMEinit 1 root cwd DIR 3,2 4096 2 /init 1 root rtd DIR 3,2 4096 2 /init 1 root txt REG 3,2 38620 1426405 /sbin/init....(底下省略)....# 注意到了嗎?是的,在預設的情況下, lsof 會將目前系統上面已經開啟的# 檔案全部列出來~所以,畫面多的嚇人啊!您可以注意到,第一個檔案 init 啟動並執行# 地方就在根目錄,而根目錄,嘿嘿!所在的 inode 也有顯示出來喔!範例二:僅列出關於 root 的所有程式開啟的 socket 檔案[root@www ~]# lsof -u root -a -UCOMMAND PID USER FD TYPE DEVICE SIZE NODE NAMEudevd 400 root 3u unix 0xedd4cd40 1445 socketauditd 4256 root 7u unix 0xedd4c380 9081 socketaudispd 4258 root 0u unix 0xedd4c1e0 9080 socket# 注意到那個 -a 吧!如果你分別輸入 lsof -u root 及 lsof -U ,會有啥資訊?# 使用 lsof -u root -U 及 lsof -u root -a -U ,呵呵!都不同啦!# -a 的用途就是在解決同時需要兩個項目都成立時啊! ^_^範例三:請列出目前系統上面所有的被啟動的周邊裝置[root@www ~]# lsof +d /devCOMMAND PID USER FD TYPE DEVICE SIZE NODE NAMEinit 1 root 10u FIFO 0,16 1147 /dev/initctludevd 400 root 0u CHR 1,3 1420 /dev/nulludevd 400 root 1u CHR 1,3 1420 /dev/nulludevd 400 root 2u CHR 1,3 1420 /dev/null# 看吧!因為裝置都在 /dev 裡面嘛!所以羅,使用搜尋目錄即可啊!範例四:秀出屬於 root 的 bash 這支程式所開啟的檔案[root@www ~]# lsof -u root | grep bashbash 20639 root cwd DIR 3,2 4096 648321 /rootbash 20639 root rtd DIR 3,2 4096 2 /bash 20639 root txt REG 3,2 735004 1199424 /bin/bashbash 20639 root mem REG 3,2 46680 64873 /lib/libnss_files-2.5.so....(底下省略)....
這個命令可以找出您想要知道的某個程式是否有啟用哪些資訊?例如上頭提到的範例四的運行結果呢!
轉自 http://vbird.dic.ksu.edu.tw/linux_basic/0440processcontrol_4.php