如何在Linux中使用和充分利用fuser命令

假设您有一个任务来识别正在使用特定文件的进程,然后逐个删除它们 - 所有这些都必须从命令行完成。 你会怎么做? 那么,如果你是新手的命令行,我相信你会无能为力,请求帮忙。

但是,命令行专业人员可能会想到在Linux中存在命令行实用程序,可以根据他们正在访问的文件(或目录或套接字)来识别进程。 不仅如此,该工具还允许您杀死这些进程,因此您不必单独使用killkillall命令。 我们所说的命令行实用程序是fuser

如果您尚未了解此实用程序,并希望了解如何使用它,请不要再进一步,如本文所述,我们将通过一些易于理解的示例详细讨论fuser

但是,在我们向前推进之前,请记住,本教程中提到的所有示例,命令和说明都已在Ubuntu 16.04 LTS上进行了测试,而我们使用的fuser命令版本为22.21。

Linux fuser命令

如上所述, fuser命令主要用于识别使用文件,目录或套接字的进程。 该工具基本上显示正在使用名称作为参数传递给该命令的文件的进程的PID。

这里是fuser命令的最基本的形式:

从上面的截图清楚,我们尝试使用fuser来知道哪些进程使用/ home / himanshu目录,并且在其输出中的命令生成了进程ID列表。 到目前为止这么好,但这里有几个问题。

首先,每个PID附加什么'c'? 快速查看命令的手册页面显示,在默认显示模式下, fuser命令不仅显示访问文件或目录的进程的PID,还显示访问类型。

每种类型的访问由一个字母表示:

  • c - 当前目录。
  • 正在运行的可执行文件。
  • f - 打开文件。 在默认显示模式下省略f。
  • F - 打开文件进行写入。 默认显示模式下省略F。
  • r - 根目录。
  • m - mmap'ed文件或共享库。

现在,回到我们讨论的例子,输出中的字母“c”表示输出中列出PID的所有进程正在访问/ home / himanshu目录作为其当前目录。

请记住,进程可以有多种类型的访问文件或目录。 例如,以下输出显示,root(/)目录正在被许多进程访问,作为它们当前以及根目录。

到目前为止,我们看到的热熔器输出仅包含进程ID,而不再是这样。 如果进程名称也显示出来会不会更好? 那么,为此,您需要使用-v命令行选项。 以下是一个例子:

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

注意 :如果有问题的文件或目录位于装入的文件系统或块设备上,请使用-m命令行选项。 “所有进程访问该文件系统上的文件”,该手册页说。 “如果指定了目录文件,它将自动更改为NAME /。以使用可能挂载在该目录上的任何文件系统。

如何使用fuser来杀死进程

现在我们已经讨论过热熔器基础知识了,我们来开始介绍一下我刚才提到的任务 - 如何使用fuser来杀死进程? 我们来看一个比较简单的例子。 我会做的是,我将运行一个可执行文件,当它运行时,我会尝试使用fuser杀死进程。

所以,这是可执行文件已经启动:

这里是fuser命令,应该理想地杀死由test-fuser可执行文件启动的进程。

fuser -v -k test-fuser

哦,在我继续执行这个命令之前,让我告诉你, -k命令行选项告诉fuser使用这个文件或目录杀死进程(或进程)。

上面提到的命令执行时,发生了什么事情

从上面的屏幕截图清楚,使用-f命令行选项与fuser会杀死test-fuser进程。 要确保fuser命令在杀死进程之前要求用户确认,请使用-i选项。 见下面的例子:

以下是使用-k选项时应该知道的几个重要的与fuser相关的详细信息:

  • 使用-k,默认情况下,fuser命令发送SIGKILL信号。 但是您可以通过使用-SIGNAL选项来更改此行为。
  • 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中是非常有用的命令行实用程序。 好的是,该工具既不难理解,也不使用,所以即使是新手也可以轻松开始使用。 我们在这里没有触及的一个方面是,该命令允许您识别甚至杀死在特定端口上运行的进程,使其成为网络管理员的难以忽略的工具。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏