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

功能

fuser 可以显示出当前哪个程序在使用磁盘上的某个文件、挂载点、甚至网络端口,并给出程序进程的详细信息.

描述

fuser 显示使用指定文件或者文件系统的进程 ID.默认情况下每个文件名后面跟一个字母表示访问类型。

访问类型如下:

  • c 代表当前目录
  • e 可执行的被运行
  • f 打开的文件。默认不显示。
  • F 打开的文件,用于写操作。默认不显示。
  • r 根目录。
  • m 映射文件或者共享库。

当指定的文件没有被访问,或者出现错误的时候, fuser 会返回非零。

为了查看使用 tcpudp 套接字的进程,需要 -n 选项并指定名称空间。默认 IpV4IpV6 都会显示。

套接字可以是本地的或者是远程的端口,和远程的地址。所有的域是可选的,但是其前面的 ',' 必须存在。如下:

[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 等许多域,如果是内核访问的那么 PIDkernel.
  • -V 输出版本号。
  • -4 使用 IPV4 套接字,不能和 -6 一起应用,只在 -ntcpudp 的命名存在时不被忽略。
  • -6 使用 IPV6 套接字,不能和 -4 一起应用,只在 -ntcpudp 的命名存在时不被忽略。
  • - 重置所有的选项,把信号设置为 SIGKILL.

更多参见 fuserman 手册.

举例

显示使用某个文件的进程信息

$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

$fuser -kmi readme

这里,会在 kill 之前询问是否确定。最好加上 -v 以便知道将要杀那个进程。

查看那些程序使用 tcp80 端口

$fuser -n tcp 80

$fuser -v -n tcp 80

$fuser -v 80/tcp

这里,后两种方式显示的信息比较全,因为有了 -v 选项。

其他

假设无法卸载的设备为 /dev/sdb1

  1. 运行下面命令看一下哪个用户哪个进程占用着此设备

    fuser -m -v /dev/sdb1

  2. 运行下面命令杀掉占用此设备的进程

    fuser -m -v -k /dev/sdb1

    或者 fuser -m -v -k -i /dev/sdb1 (每杀掉一下进程会让你确认)

  3. umount

杀掉所有以任何形式访问文件系统 /home 的进程

$fuser -km /home