2011年11月5日 星期六

fuser:藉由檔案(或檔案系統)找出正在使用該檔案的程序

  • 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:    4892
Kill process 4892 ? (y/N) n
如何?很有趣的一個指令吧!透過這個 fuser 我們可以找出使用該檔案、目錄的程序,藉以觀察的啦! 他的重點與 ps, pstree 不同。 fuser 可以讓我們瞭解到某個檔案 (或檔案系統) 目前正在被哪些程序所利用!

沒有留言:

張貼留言