「fuser(1)」-

使用文件或套接字来识别进程

命令语法格式

fuser [-fuv] [-a|-s] [-4|-6] [-c|-m|-n space] [ -k [-i] [-M] [-w] [-SIGNAL] ] name …

fuser -l

fuser -V

命令描述

命令fuser显示所有正在使用指定文件文件系统的进程。在默认的显示模式中,每个文件名后面都跟着一个字符,该字符表示访问类型:

c,当前目录。

e,正在运行的可执行文件。

f,打开文件。默认的显示模式下,省略f。

F,打开文件进行写入。默认显示模式下,省略F。

r,根目录。

m,mmap的文件或共享库。

.,占位符,在默认显示模式下省略。

如果指定的文件没有被访问、或在致命错误的情况下,fuser返回非零返回码。如果至少找到一个访问,则返回零。

为了使用TCP和UDP套接字来查找进程,必须使用-n选项指明相应的命名空间。默认情况下,fuser将查找IPv6和IPv4套接字。要更改默认行为,使用-4和-6选项。套接字可以由本地和远程端口,以及远程地址指定。所有字段都是可选的,但缺少字段前面的逗号必须存在:

[lcl_port][,[rmt_host][,[rmt_port]]]

其中,IP地址和端口号可以使用符号或数值。

命令fuser只会将PIDs输出到标准输出,其他一切都会发送到标准错误。

命令支持的选项及含义

-a, –all
输出中,显示在命令行中指定的所有文件。默认,至少存在一个访问进程的文件才会被显示。

-k, –kill
杀死访问该文件的进程。除非用-SIGNAL更改信号,否则默认发送SIGKILL。fuser不会杀死自身,但可能会杀死其他fuser进程。在尝试杀死之前,执行fuser的进程的“有效用户ID”设置为其“真实的用户ID”。

-i, –interactive
杀死一个进程前,请求用户确认。如果-k不存在,则此选项将被忽略。

-w
仅杀死具有写入权限的进程。如果-k不存在,则此选项将被忽略。

-SIGNAL
杀死进程时,使用指定的信号,代替默认的SIGKILL。信号即可以通过「信号名」指定(例如,-HUP),也可以通过信号值(例如,-1)指定。如果没有指定-k,该选项会被静默的忽略。

-I, –inode
对于命名空间文件,所有比较都基于指定文件的inode,即使在基于网络的文件系统上也不会基于文件名。

-l, –list-signals
列出所有可用的信号名。

-m NAME, –mount NAME
参数NAME指定已挂载文件系统上的文件,或已挂载的块设备。 将列出访问该文件系统上的文件的所有进程。

如果指定的NAME为目录,则会自动更改为“NAME/.”使用可能挂载在该目录上的任何文件系统。

-M, –ismountpoint
只有在NAME指定的是挂载点时,才会继续执行请求。这是一个保险错措施:如果NAME不是文件系统,则可以防止杀死机器。

-n SPACE, –namespace SPACE
选择不同的命名空间。命名空间支持:file(文件名,默认值)、udp(本地UDP端口)、tcp(本地TCP端口)。对于端口,可以指定「端口号」或「符号名称」。如果没有歧义,可以直接使用快捷方式name/space(例如80/tcp)。

-u, –user
在输出的PID后面,追加进程所有者的用户名。

-4, –ipv4
只搜索IPv4的套接字。不能与-6一起使用,只对tcp和udp命名空间有效。

-6, –ipv6
只搜索IPv6的套接字。不能与-4一起使用,只对tcp和udp命名空间有效。


重置所有的选项,并设置信号为SIGKILL。

-v, –verbose
详细模式输出。

输出进程以ps(1)风格显示。输出字段PID、USER、COMMAND与命令ps(1)中的类似。字段ACCESS显示进程如何访问文件。

在详细模式下,还将显示特定文件作为挂载点、NFS导出、交换文件访问。在这种情况下,显示kernel而不是PID。

-s, –silent
安静模式。选项-u和-v在此模式下会被忽略。选项-a不能与-s一起使用。

其他选项

-f
静默忽略,用于POSIX兼容。

-c
与-m选项相同,用于POSIX兼容。

-V, –version
显示版本信息。

注意事项

即使你没有配置该设备,命令fuser -m /dev/sgX将显示(或使用-k标志表示结束)所有进程。也可能会有其他设备也这样。

对于mount的-m选项,将匹配与指定文件相同的设备中的任何文件。如果只想指定挂载点,那么也可以使用-M选项。

存在的限制

以同样的方式多次访问同一文件或文件系统的进程,只显示一次。

如果在命令行上多次指定相同的对象,则可能会忽略其中的一些条目。

除非运行特权,否则fuser只能收集部分信息。因此,属于其他用户的进程打开的文件可能不被列出,可执行文件可能被分类为“仅映射”。设置fuser的SETUID为root将避免与部分信息相关的问题,但由于安全和隐私的原因,可能不希望这样。

命令fuser无法报告它没有查看文件描述符表的权限的任何进程。 出现此问题的最常见时间是在以非root用户身份运行fuser时查找TCP或UDP套接字。 在这种情况下,fuser将报告无访问权限。

udp和tcp名称空间、UNIX域套接字,不能在1.3.78以前的内核中使用。

由内核访问,只有使用-v选项时才显示。

选项-k仅适用于进程。如果用户是内核,fuser将打印一个建议,但不采取任何行动。

相关文件

/proc
proc文件系统的位置

使用示例

结束所有正在访问/home的进程:

# fuser -km /home

如果没有进程正在使用/dev/ttys1,则执行某些东西:

# if fuser -s /dev/ttyS1; then :; else something; fi

显示所有在本地TELNET端口的进程:

# fuser telnet/tcp

如上示例。

相关手册

kill(1), killall(1), lsof(8), pkill(1), ps(1), kill(2).

参考文献

更新日志

  • 08/10/2017 创建文章
  • 09/26/2018 修改文章内容