概述

[root@localhost ~]# rpm -qf /sbin/fuser
psmisc-22.6-15.el6_0.1.x86_64

先说 fuser的作用,fuser能识别出正在对某个文件或端口访问的进程,大家想一下,还有哪个命令具备这个功能? 没错,是lsof,我们前面讲过, lsof能够找出正在对指定文件访问的进程,
那么它们两者之间有何区别?fuser有一个特别的用法在于它可以一次杀死那些正在访问指定文件的进程。

解释
fuser会显示正在使用指定的file,file system 或者 sockets的进程的PID。在默认的显示模式下,每个文件名之后会跟随一个字符,用来指示当前的访问类型。
fuser命令是用来显示所有正在使用着指定的file, file system 或者 sockets的进程信息。
[root@coreserv ~]# fuser /var/log/messages file
[root@CentOS5 ~]# fuser -m /dev/sda3 file system
[root@coreserv ~]# fuser /var/run/acpid.socket sockets

s 将此文件作为共享库(或其他可装载对象)使用
c current directory. 将此文件作为当前目录使用。
e executable being run. 将此文件作为程序的可执行对象使用。
f open file.
F open file for writing.
r root directory. 将此文件作为根目录使用。
m mmap'ed file or shared library

-m 表示指定文件所在的文件系统或者块设备(处于 mount 状态)。所有访问该文件系统的进程都被列出。假如指定了一个目录,则自动在后面加上 '/' 表示挂载在该目录上的文件系统
使用了-m和-u选项,用来查找所有正在使用/dev/sda3的所有进程的PID以及该进程的所有者,如1347c(root),其中1347是进程PID,root是该进程的所有者。
-s 表示安静模式。-u 和 -v 会被忽略,-a 不能和 -s 一起使用
-n 指定 sockets 的协议类型。可以是 file(默认)、udp、tcp。你甚至可以使用 '<port>/<proto>' 的简写方式,只要不存在异义的话,在端口方面,你可以用端口名或者数字表示
-u 表示在 PID 后面加上进程的 owner
-v 表示 verbose 模式。进程以ps 的方式显示,包括 PID、USER、COMMAND、ACCESS 字段,如果是内核访问的(例如 mount point、swap 文件),则显示为 kernel 而不是 pid
fuser如果没有找到任何进程正在使用指定的file, filesystem 或 socket, 或者在查找过程中发生了fatal error,则返回non-zero 值。
fuser如果找到至少一个进程正在使用指定的file, filesystem 或 socket,则返回zero。
可用# echo $?来证实

样例
fuser 只输出 PID 到 stdout ,其他都送给 stderr
fuser -km /home
fuser -v -n tcp 111
fuser http/tcp

-k 表示杀死访问指定文件的进程。默认发送 SIGKILL (-9)信号。fuser 进程永远不会杀死自己。
fuser通常被用在诊断系统的“resource busy”问题,通常是在你希望umount指定的挂载点得时候遇到。如果你希望kill所有正在使用某一指定的file, file system or sockets的进程的时候,你可以使用-k option。
fuser -k /path/to/your/filename
这时fuser会向所有正在使用/path/to/your/filename的进程发送SIGKILL。如果你希望在发送之前得到提示,可以使用-i选项。
fuser -k -i /path/to/your/filename
通常做法
fuser -l
fuser可以发送它已知的信号给访问的指定文件进程而代替-k参数,默认发送的SIGKILL
fuser -v /root/install.log
fuser -SIGHUP /root/install.log
fuser -v /root/install.log

lsof |grep unix 查找套接字
文件级是指有文件系统的。 需要挂载才能使用
块级是指裸设备,没有任何文件系统。需要挂载才能使用

04-06 04:35