引言
fuser是linux中較常用的工具,"fuser"——從其名稱我們可以看出該工具的用途:查詢給定文件或目錄的用戶或進程信息。
除查詢文件相關信息之外,使用fuser還能向進程發送SIGKILL等信號,完成強制讓進程退出的功能,下面我們就來看fuser工具的具體使用方法。
以上命令查詢了/root目錄被哪些進程使用,輸出包含進程的PID以及字符’c’。字符’c’指示了進程的工作目錄,使用以下命令可進行驗證:
查詢文件和目錄使用者
fuser最基本的用法是查詢某個文件或目錄被哪個進程使用:
# fuser /root
/root: 17923c 24869c
以上命令查詢了/root目錄被哪些進程使用,輸出包含進程的PID以及字符’c’。字符’c’指示了進程的工作目錄,使用以下命令可進行驗證:
# ls -l /proc/17923/cwd lrwxrwxrwx 1 root root 0 Apr 19 09:02 /proc/17923/cwd -> /root
PID后跟的字符說明了進程以何種方式與該目錄/文件關聯,有以下關聯方式:
c 指示進程的工作目錄
e 指示該文件為進程的可執行文件(即進程由該文件拉起)
f 指示該文件被進程打開,默認情況下f字符不顯示
F 指示該文件被進程打開進行寫入,默認情況下F字符不顯示
r 指示該目錄為進程的根目錄
m 指示進程使用該文件進行內存映射,抑或該文件為共享庫文件,被進程映射進內存
使用-v選項將顯示更全的信息:
# fuser -v /root USER PID ACCESS COMMAND /root: root 17923 ..c.. bash root 24869 ..c.. atop
下面我們使用一個端口監聽的例子,來看可執行文件、socket端口使用進程的信息查詢。
# ./socket &
以上socket程序是一個使用C編寫的小程序,起一個TCP服務端,監聽9999端口,代碼請查附件。
執行完該程序時候,我們使用fuser進行查詢:
# fuser -v socket USER PID ACCESS COMMAND socket: root 11861 ...e. socket
可以看到PID為11861與socket文件的關聯方式為’e’,與上表所列相符。
查詢socket和文件系統使用者
除了查詢文件、目錄的相關使用進程,我們還可以對socket端口的使用者進行查詢。還是使用上面socket程序,我們對端口9999進行如下查詢:
# fuser -v -n tcp 9999 USER PID ACCESS COMMAND 9999/tcp: root 11861 F.... socket
另外,針對某文件系統的使用者,我們可以使用-m參數進行查詢,對於以下分區的系統:
# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 15735128 10218084 5517044 65% / udev 4091824 168 4091656 1% /dev /dev/sda3 47550928 43836764 3714164 93% /home1 /dev/sdb2 70627600 64344256 6283344 92% /home2
執行以下查詢命令:
# fuser -m /home1
/home1: 2703ce
可以看到/dev/sda3分區的使用者為2703對應的進程,執行fuser –m /dev/sda3、fuser –m /home1/test將得到相同的結果。
使用fuser關閉進程
除了可以使用fuser進行查詢之外,fuser還可以向進程發送信號,讓進程退出:
# fuser -v -k socket USER PID ACCESS COMMAND socket: root 11861 ...e. socket [1]+ Killed ./socket
-k選項表示向使用socket文件的相關進程發送SIGKILL信號。除了發送SIGKILL信號之外,fuser還可以發送以下信號:
# fuser -l /home
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
另外,加上-i選項,在KILL進程時,需要人為地進行確認:
# fuser -v -k -i socket USER PID ACCESS COMMAND socket: root 11861 ...e. socket Kill process 11861 ?(y/N)
小結
本文介紹了fuser工具的用法,fuser可用於查詢文件、目錄、socket端口和文件系統的使用進程,並且可以使用fuser關閉進程。
當文件系統umount報device busy時,常用到fuser查詢並關閉使用相應文件系統的進程。
本文翻譯自 5 Practical Linux fuser Command Examples