如何在 Linux 中使用和充分利用 fuser 命令
在此页
- Linux fuser 命令
- 如何使用 fuser 终止进程
- 定影器 - 其他细节
- 结论
假设您的任务是识别正在使用特定文件的进程,然后将它们一个一个地杀死——所有这些都必须从命令行完成。你会怎么做?好吧,如果你是命令行新手,我相信你会一无所知,四处寻求帮助。
但是命令行专家可能会认为 Linux 中存在一个命令行实用程序,可以让您根据进程正在访问的文件(或目录,或套接字)来识别进程。不仅如此,该工具还允许您终止这些进程,因此您不必单独使用 kill 或 killall 命令。我们讨论的命令行实用程序是 fuser。
如果您还不知道这个实用程序并想了解如何使用它,不要再看了,因为在本文中,我们将通过一些易于理解的示例详细讨论 fuser。
但在我们继续之前,请记住本教程中提到的所有示例、命令和说明都已在 Ubuntu 16.04 LTS 上测试过,我们使用的 fuser 命令版本是 22.21。
Linux fuser 命令
fuser 命令——正如我在上面提到的——主要用于识别使用文件、目录或套接字的进程。该工具主要显示正在使用其名称作为参数传递给命令的文件的进程的 PID。
下面是 fuser 命令的最基本形式:

从上面的屏幕截图可以清楚地看出,我们尝试使用 fuser 来了解哪些进程正在使用 /home/himanshu 目录,并且命令 - 在其输出中 - 生成了一个列表进程 ID。到目前为止一切顺利,但这里有几个问题。
首先,附加到每个 PID 的 c 是什么?快速查看命令手册页会发现,在默认显示模式下,fuser 命令不仅会显示访问文件或目录的进程的 PID,还会显示访问类型。
每种类型的访问都用一个字母表示:
- c - 当前目录。
- e - 正在运行的可执行文件。
- f - 打开文件。 f 在默认显示模式下被省略。
- F - 打开文件进行写入。默认显示模式下省略 F。
- r - 根目录。
- m - 映射文件或共享库。
现在,回到我们正在讨论的示例,输出中的字母 c 表示其 PID 在输出中列出的所有进程正在访问 /home/himanshu 目录作为它们的当前目录。
请记住,一个进程可以对文件或目录进行多种类型的访问。例如,以下输出显示许多进程正在访问根 (/) 目录作为它们的当前目录和根目录。

到目前为止,fuser 输出只包含进程 ID,仅此而已。如果把进程名也显示出来岂不是更好?那么,为此您需要使用 -v 命令行选项。下面是一个例子:

继续,要将进程所有者的用户名附加到每个 PID,请使用 -u 命令行选项。这是一个例子:

注意:如果有问题的文件或目录位于已挂载的文件系统或块设备上,则使用 -m 命令行选项。 \“列出了访问该文件系统上的文件的所有进程,”手册页说。 \如果指定了目录文件,它会自动更改为 NAME/。以使用可能安装在该目录上的任何文件系统。\
如何使用 fuser 终止进程
既然我们已经讨论了 fuser 基础知识,让我们来完成我在开头提到的任务 - 如何使用 fuser 终止进程?让我们为这种情况举一个更简单的例子。我要做的是,我将运行一个可执行文件,并在其运行时尝试使用 fuser 终止该进程。
因此,这是已启动的可执行文件:

这是 fuser 命令,理想情况下应该终止由 test-fuser 可执行文件启动的进程。
fuser -v -k test-fuser
哦,在我继续执行这个命令之前,让我告诉你 -k 命令行选项告诉 fuser 终止使用文件或目录的一个或多个进程。
以下是执行上述命令时发生的情况:

从上面的屏幕截图可以清楚地看出,使用 -k 命令行选项和 fuser 会终止 test-fuser 进程。要确保 fuser 命令在终止进程之前要求用户确认,请使用 -i 选项。请参见下面的示例:

以下是您在使用 -k 选项时应该了解的一些与定影器相关的重要细节:
- 使用-k 时,fuser 命令默认发送SIGKILL 信号。但是您可以使用 -SIGNAL 选项更改此行为。
- 一个 fuser 进程永远不会杀死自己,但可能会杀死其他 fuser 进程。
定影器 - 其他细节
除了到目前为止提到的信息之外,还有一些其他细节值得牢记。所有这些信息都可以通过前往命令手册页来访问。例如,以下是 fuser 手册页在“限制”部分列出的信息:
Processes accessing the same file or file system several times in the
same way are only shown once.
If the same object is specified several times on the command line, some
of those entries may be ignored.
fuser may only be able to gather partial information unless run with
privileges. As a consequence, files opened by processes belonging to
other users may not be listed and executables may be classified as
mapped only.
Installing fuser SUID root will avoid problems associated with partial
information, but may be undesirable for security and privacy reasons.
udp and tcp name spaces, and UNIX domain sockets can't be searched with
kernels older than 1.3.78.
Accesses by the kernel are only shown with the -v option.
The -k option only works on processes. If the user is the kernel,
fuser will print an advice, but take no action beyond that.
结论
正如您现在所了解的,fuser 是 Linux 中非常有用的命令行实用程序。好处是该工具既不难理解也不难使用,因此即使是新手也可以轻松上手。我们在这里没有触及的一个方面是该命令允许您识别甚至杀死在特定端口上运行的进程,这也使其成为网络管理员难以忽视的工具。