查询进程打开的文件(转)
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 /procUSER PID ACCESS COMMAND /proc: root 4289 f.... (root)klogdroot 4555 f.... (root)acpidhaldaemon 4758 f.... (haldaemon)haldroot 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/.gdmfifoUSER 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 可以讓我們了解到某個文件 (或文件系統) 目前正在被哪些程序所利用!
?
lsof
相對於 fuser 是由文件或者裝置去找出使用該文件或裝置的程序,反過來說, 如何查出某個程序開啟或者使用的文件與裝置呢?呼呼!那就是使用 lsof 羅~
[root@www ~]# lsof [-aUu] [+d] 選項與參數: -a :多項數據需要『同時成立』才顯示出結果時! -U :僅列出 Unix like 系統的 socket 文件類型; -u :后面接 username,列出該使用者相關程序所開啟的文件; +d :后面接目錄,亦即找出某個目錄底下已經被開啟的文件!范例一:列出目前系統上面所有已經被開啟的文件與裝置: [root@www ~]# lsof COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 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 -U COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME udevd 400 root 3u unix 0xedd4cd40 1445 socket auditd 4256 root 7u unix 0xedd4c380 9081 socket audispd 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 /dev COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root 10u FIFO 0,16 1147 /dev/initctl udevd 400 root 0u CHR 1,3 1420 /dev/null udevd 400 root 1u CHR 1,3 1420 /dev/null udevd 400 root 2u CHR 1,3 1420 /dev/null # 看吧!因為裝置都在 /dev 里面嘛!所以羅,使用搜尋目錄即可啊!范例四:秀出屬於 root 的 bash 這支程序所開啟的文件 [root@www ~]# lsof -u root | grep bash bash 20639 root cwd DIR 3,2 4096 648321 /root bash 20639 root rtd DIR 3,2 4096 2 / bash 20639 root txt REG 3,2 735004 1199424 /bin/bash bash 20639 root mem REG 3,2 46680 64873 /lib/libnss_files-2.5.so ....(底下省略)....這個命令可以找出您想要知道的某個程序是否有激活哪些資訊?例如上頭提到的范例四的運行結果呢!
轉自?http://www.cnblogs.com/ggjucheng/archive/2012/10/24/2737851.html
?
轉載于:https://www.cnblogs.com/fwdxl/p/6706078.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的查询进程打开的文件(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Maximum sum(poj 2479
- 下一篇: 【一些简单的jQuery选择器】