地址:http://www.cnblogs.com/bangerlee/articles/2460614.html
引言
fuser是linux中较常用的工具,"fuser"——从其名称我们可以看出该工具的用途:查询给定文件或目录的用户或进程信息。
除查询文件相关信息之外,使用fuser还能向进程发送SIGKILL等信号,完成强制让进程退出的功能,下面我们就来看fuser工具的具体使用方法。
以上命令查询了/root目录被哪些进程使用,输出包含进程的PID以及字符’c’。字符’c’指示了进程的工作目录,使用以下命令可进行验证:
查询文件和目录使用者
fuser最基本的用法是查询某个文件或目录被哪个进程使用:
# fuser /root/root: 17923c 24869c
以上命令查询了/root目录被哪些进程使用,输出包含进程的PID以及字符’c’。字符’c’指示了进程的工作目录,使用以下命令可进行验证:
# ls -l /proc/17923/cwdlrwxrwxrwx 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 COMMANDsocket: root 11861 ...e. socket
可以看到PID为11861与socket文件的关联方式为’e’,与上表所列相符。
查询socket和文件系统使用者
除了查询文件、目录的相关使用进程,我们还可以对socket端口的使用者进行查询。还是使用上面socket程序,我们对端口9999进行如下查询:
# fuser -v -n tcp 9999 USER PID ACCESS COMMAND9999/tcp: root 11861 F.... socket
-n获取某一端口的进程信息 henmap组合时尤其有用。。。。
另外,针对某文件系统的使用者,我们可以使用-m参数进行查询,对于以下分区的系统:
# dfFilesystem 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 COMMANDsocket: root 11861 ...e. socket [1]+ Killed ./socket
-k选项表示向使用socket文件的相关进程发送SIGKILL信号。除了发送SIGKILL信号之外,fuser还可以发送以下信号:
# fuser -l /homeHUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERMSTKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYSUNUSED
另外,加上-i选项,在KILL进程时,需要人为地进行确认:
# fuser -v -k -i socket USER PID ACCESS COMMANDsocket: root 11861 ...e. socketKill process 11861 ?(y/N)
小结
本文介绍了fuser工具的用法,fuser可用于查询文件、目录、socket端口和文件系统的使用进程,并且可以使用fuser关闭进程。
当文件系统umount报device busy时,常用到fuser查询并关闭使用相应文件系统的进程。
本文翻译自 5 Practical Linux fuser Command Examples