1. 程式人生 > 實用技巧 >Linux fuser 命令詳解

Linux fuser 命令詳解

Linux fuser 命令詳解

轉載於:https://www.jianshu.com/p/a7d69cc9e704

fuser命令小結

linux環境下,當使用umount命令解除安裝掛載點時,會遇到“device is busy”提示,這時fuser就能查出誰在使用這個資源;當然umount –lf [掛載點] 也可以強制解除安裝

功能

fuser 可以顯示出當前哪個程式在使用磁碟上的

某個檔案
掛載點
甚至網路埠

並給出程式程序的詳細資訊.

fuser只把PID輸出到標準輸出,其他的都輸出到標準錯誤輸出。

常用選項

-a 顯示所有命令列中指定的檔案,預設情況下被訪問的檔案才會被顯示。
-c 和-m一樣,用於POSIX相容。
-k 殺掉訪問檔案的程序。如果沒有指定-signal就會發送SIGKILL訊號。結合 –signal

-signal 使用指定的訊號,而不是用SIGKILL來殺掉程序。可以通過名稱或者號碼來表示訊號(例如-HUP,-1),這個選項要和-k一起使用,否則會被忽略。

-l 列出所有已知的訊號名稱。
-i 殺掉程序之前詢問使用者,如果沒有-k這個選項會被忽略。
-m name 指定一個掛載檔案系統上的檔案或者被掛載的塊裝置(名稱name)。這樣所有訪問這個檔案或者檔案系統的程序都會被列出來。如果指定的是一個目錄會自動轉換成"name/",並使用所有掛載在那個目錄下面的檔案系統。
-n space 指定一個不同的名稱空間(space).這裡支援不同的空間檔案(檔名,此處預設)、tcp(本地tcp埠)、udp(本地udp埠)。對於埠,可以指定埠號或者名稱,如果不會引起歧義那麼可以使用簡單表示的形式,例如:name/space (即形如:80/tcp之類的表示)。
-s 靜默模式,這時候-u,-v會被忽略。-a不能和-s一起使用。
-u 在每個PID後面新增程序擁有者的使用者名稱稱。
-v 詳細模式。輸出似ps命令的輸出,包含PID,USER,COMMAND等許多域,如果是核心訪問的那麼PID為kernel.

案例

假設無法解除安裝的裝置為/dev/sdb1
1)執行下面命令看一下哪個使用者哪個程序佔用著此裝置
fuser -m -v /dev/sdb1

2)執行下面命令殺掉佔用此裝置的程序
fuser -m -v -k /dev/sdb1
或者fuser -m -v -k -i /dev/sdb1(每殺掉一下程序會讓你確認)
3)再umount

檢視那些程式使用tcp的80埠:
$fuser -n tcp 80
或$fuser -v -n tcp 80
或$fuser -v 80/tcp
這裡,後兩種方式顯示的資訊比較全,因為有了-v選項

# fuser -v 111/udp 111/tcp 
                     使用者     程序號 許可權   命令
111/udp:             rpc         968 F.... rpcbind
111/tcp:             rpc         968 F.... rpcbind

如上例子中第4列的許可權也成訪問型別,如下:

c 代表當前目錄                              F 開啟的檔案,用於寫操作。預設不顯示。

e 可執行的被執行                          m 對映檔案或者共享庫。

f 開啟的檔案。預設不顯示。         r 根目錄。    

其它相同命令:

# netstat -lntup|grep 111
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      968/rpcbind         
tcp        0      0 :::111                      :::*                        LISTEN      968/rpcbind         
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               968/rpcbind         
udp        0      0 :::111                      :::*                                    968/rpcbind
# ss  -lntup|grep 111       
udp    UNCONN     0      0                      *:111                   *:*      users:(("rpcbind",968,6))
udp    UNCONN     0      0                     :::111                  :::*      users:(("rpcbind",968,9))
tcp    LISTEN     0      128                   :::111                  :::*      users:(("rpcbind",968,11))
tcp    LISTEN     0      128                    *:111                   *:*      users:(("rpcbind",968,8))
# lsof -i :111
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 968  rpc    6u  IPv4  11275      0t0  UDP *:sunrpc 
rpcbind 968  rpc    8u  IPv4  11278      0t0  TCP *:sunrpc (LISTEN)
rpcbind 968  rpc    9u  IPv6  11280      0t0  UDP *:sunrpc 
rpcbind 968  rpc   11u  IPv6  11283      0t0  TCP *:sunrpc (LISTEN)

signal列表

# fuser -l
HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
UNUSED

# kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

詳細使用命令 man 7signal

fuser功能

fuser 可以顯示出當前哪個程式在使用磁碟上的某個檔案、掛載點、甚至網路埠,並給出程式程序的詳細資訊.

fuser顯示使用指定檔案或者檔案系統的程序ID.預設情況下每個檔名後面跟一個字母表示訪問型別。

訪問型別如下:

c 代表當前目錄  
e 將此檔案作為程式的可執行物件使用 
f 開啟的檔案。預設不顯示。  
F 開啟的檔案,用於寫操作。預設不顯示。  
r 根目錄。  
m 對映檔案或者共享庫。 
s 將此檔案作為共享庫(或其他可裝載物件)使用
當指定的檔案沒有被訪問,或者出現錯誤的時候,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.  

使用示例

顯示使用某個檔案的程序資訊

$ 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  

這裡,會在kill之前詢問是否確定。最好加上-v以便知道將要殺那個程序。
檢視那些程式使用tcp的80埠

$fuser -v -n tcp 80  

$fuser -v 80/tcp  

fuser不同訊號的應用

用 -l引數可以列出fuser所知的訊號

fuser -l

HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
UNUSED

fuser可以傳送它已知的訊號給訪問的指定檔案程序而代替-k引數預設傳送的SIGKILL,例如:只是掛起程序,那麼傳送HUP訊號就可以了

fuser -v /root/install.log

                  使用者     程序號 許可權   命令

/root/install.log: root 3347 f.... tail

fuser -k -SIGHUP /root/install.log

/root/install.log: 3347

fuser -v /root/install.log

參考至:http://hi.baidu.com/bossyt/item/020e2cddf09463ee3cc2cb1a
http://wenku.baidu.com/view/7e42df3667ec102de2bd8927.html
http://blog.sina.com.cn/s/blog_59af21260100tv1m.html