fuser
<b>它的功能:</b>fuser 可以顯示出目前哪個程式在使用磁盤上的某個檔案、挂載點、甚至網絡端口,并給出程式程序的詳細資訊.
<b>通路類型:</b>fuser顯示使用指定檔案或者檔案系統的程序ID.預設情況下每個檔案名後面跟一個字母表示通路類型。
通路類型如下:
c 代表目前目錄
e 可執行的被運作
f 打開的檔案。預設不顯示。
F 打開的檔案,用于寫操作。預設不顯示。
r 根目錄。
m 映射檔案或者共享庫。
當指定的檔案沒有被通路,或者出現錯誤的時候,fuser會傳回非零。
為了檢視使用tcp和udp套接字的程序,需要-n選項并指定名稱空間。預設IpV4和IpV6都會顯示。套接字可以是本地的或者是遠端的端口,和遠端的位址。所有的域是可選的,但是其前面的','必須存在。如下:
[lcl_port][,[rmt_host][,[rmt_port]]]
對于ip位址和port,名稱和數字表示都可以使用。
fuser隻把PID輸出到标準輸出,其他的都輸出到标準錯誤輸出。
一些常用選項:
-a 顯示所有指令行中指定的檔案,預設情況下被通路的檔案才會被顯示。
-c 和-m一樣,用于POSIX相容。
-k 殺掉通路檔案的程序。如果沒有指定-signal就會發送SIGKILL信号。
-i 殺掉程序之前詢問使用者,如果沒有-k這個選項會被忽略。
-l 列出所有已知的信号名稱。
-m name 指定一個挂載檔案系統上的檔案或者被挂載的塊裝置(名稱name)。這樣所有通路這個檔案或者檔案系統的程序都會被列出來。如果指定的是一個目錄會自動轉換成"name/",并使用所有挂載在那個目錄下面的檔案系統。
-n space 指定一個不同的命名空間(space).這裡支援不同的空間檔案(檔案名,此處預設)、tcp(本地tcp端口)、udp(本地udp端口)。對于端口, 可以指定端口号或者名稱,如果不會引起歧義那麼可以使用簡單表示的形式,例如:name/space (即形如:80/tcp之類的表示)。
-s 靜默模式,這時候-u,-v會被忽略。-a不能和-s一起使用。
-signal 使用指定的信号,而不是用SIGKILL來殺掉程序。可以通過名稱或者号碼來表示信号(例如-HUP,-1),這個選項要和-k一起使用,否則會被忽略。
-u 在每個PID後面添加程序擁有者的使用者名稱。
-v 詳細模式。輸出似ps指令的輸出,包含PID,USER,COMMAND等許多域,如果是核心通路的那麼PID為kernel.
-V 輸出版本号。
-4 使用IPV4套接字,不能和-6一起應用,隻在-n的tcp和udp的命名存在時不被忽略。
-6 使用IPV6套接字,不能和-4一起應用,隻在-n的tcp和udp的命名存在時不被忽略。
- 重置所有的選項,把信号設定為SIGKILL.
<b>案例如下:</b>
*顯示使用某個檔案的程序資訊:
$ fuser -um /dev/sda2
輸入之後,輸出如下:
/dev/sda2: 6378c(quietheart) 6534c(quietheart) 6628(quietheart) 6653c(quietheart) 7429c(quietheart) 7549c(quietheart) 7608c(quietheart)
這個指令在umount的時候很有用,可以找到還有哪些用到這個裝置了。
*殺掉打開readme檔案的程式,在确定之前有提示:
$fuser -m -k -i readme
或$fuser -kmi readme
這裡,會在kill之前詢問是否确定。最好加上-v以便知道将要殺那個程序。
*檢視那些程式使用tcp的80端口:
$fuser -n tcp 80
或$fuser -v -n tcp 80
或$fuser -v 80/tcp
這裡,後兩種方式顯示的資訊比較全,因為有了-v選項。
<b></b>
*假設無法解除安裝的裝置為/dev/sdb1
1)運作下面指令看一下哪個使用者哪個程序占用着此裝置
fuser -m -v /dev/sdb1
2)運作下面指令殺掉占用此裝置的程序
fuser -m -v -k /dev/sdb1
或者fuser -m -v -k -i /dev/sdb1(每殺掉一下程序會讓你确認)
3)再umount
4)掃描/dev/sdb1分區
[/sbin/]fsck [-ay] /dev/sdb1
*殺掉所有以任何形式通路檔案系統 /home的程序:
$fuser -km /home