侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux fuser命令教程:如何查找和终止使用文件的进程(附实例详解和注意事项)

Linux fuser命令介绍

fuser命令是file user的缩写,它用于查找哪些进程正在使用指定的文件、目录或者套接字。fuser命令可以帮助我们诊断文件系统挂载、进程管理、网络连接等问题。fuser命令还可以用于终止或者发送信号给使用指定文件的进程。

Linux fuser命令适用的Linux版本

fuser命令是一个标准的Linux命令,它适用于大多数的Linux发行版,如Ubuntu、Debian、CentOS、Fedora等。如果你的系统没有安装fuser命令,你可以使用以下命令来安装:

  • Ubuntu或Debian系统:
[linux@bashcommandnotfound.cn ~]$ sudo apt-get install psmisc
  • CentOS或Fedora系统:
[linux@bashcommandnotfound.cn ~]$ sudo yum install psmisc

Linux fuser命令的基本语法

fuser命令的基本语法格式如下:

fuser [选项] [文件名|目录名|套接字名]

Linux fuser命令的常用选项或参数说明

fuser命令有很多选项和参数,可以用于控制输出格式、指定信号、设置访问模式等。以下是一些常用的选项和参数:

选项或参数说明
-a显示所有指定文件的进程,即使它们没有访问
-k终止使用指定文件的进程
-i在终止进程之前,要求用户确认
-s静默模式,不显示错误和警告信息
-u显示进程的用户名
-v显示详细的输出信息
-m将指定文件作为文件系统挂载点处理
-n指定名称空间,可以是c(文件)、f(文件系统)、u(UDP套接字)、t(TCP套接字)或者4(IPv4套接字)
-S指定信号,可以是信号名或者信号编号

Linux fuser命令的实例

以下是一些fuser命令的实例,可以帮助你更好地理解和使用这个命令。

实例1:查找哪些进程正在使用某个文件

假设我们有一个文件test.txt,我们想知道哪些进程正在使用它,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ fuser test.txt

输出结果类似于:

test.txt: 1234 5678

这表示有两个进程,分别是1234和5678,正在使用test.txt文件。如果我们加上-u选项,我们还可以看到进程的用户名,如:

[linux@bashcommandnotfound.cn ~]$ fuser -u test.txt

输出结果类似于:

test.txt: 1234(root) 5678(bob)

这表示1234进程是root用户运行的,5678进程是bob用户运行的。

实例2:查找哪些进程正在使用某个目录

假设我们有一个目录test,我们想知道哪些进程正在使用它,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ fuser test

输出结果类似于:

test: 1234c 5678e

这表示有两个进程,分别是1234和5678,正在使用test目录。注意,输出结果中的c和e表示进程的访问模式,c表示当前目录,e表示执行。如果我们加上-v选项,我们还可以看到进程的详细信息,如:

[linux@bashcommandnotfound.cn ~]$ fuser -v test

输出结果类似于:

                     USER        PID ACCESS COMMAND
test:                root       1234 ..c.. bash
                     bob        5678 ..ce. python

这表示1234进程是root用户运行的bash命令,5678进程是bob用户运行的python命令。

实例3:查找哪些进程正在使用某个套接字

假设我们有一个TCP套接字,端口号为80,我们想知道哪些进程正在使用它,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ fuser -n tcp 80

输出结果类似于:

80/tcp: 1234 5678

这表示有两个进程,分别是1234和5678,正在使用80端口的TCP套接字。如果我们加上-v选项,我们还可以看到进程的详细信息,如:

[linux@bashcommandnotfound.cn ~]$ fuser -v -n tcp 80

输出结果类似于:

                     USER        PID ACCESS COMMAND
80/tcp:              root       1234 F.... nginx
                     www-data   5678 F.... nginx

这表示1234进程是root用户运行的nginx命令,5678进程是www-data用户运行的nginx命令。

实例4:终止使用某个文件的进程

假设我们有一个文件test.txt,我们想终止所有使用它的进程,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ fuser -k test.txt

这会向使用test.txt文件的进程发送SIGKILL信号,强制终止它们。如果我们加上-i选项,我们还可以在终止进程之前,要求用户确认,如:

[linux@bashcommandnotfound.cn ~]$ fuser -k -i test.txt

输出结果类似于:

test.txt: 1234 5678
Kill process 1234 ? (y/N) y
Kill process 5678 ? (y/N) y

这会让用户选择是否终止每个进程。

实例5:发送信号给使用某个文件的进程

假设我们有一个文件test.txt,我们想向所有使用它的进程发送SIGTERM信号,让它们优雅地退出,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ fuser -k -S TERM test.txt

这会向使用test.txt文件的进程发送SIGTERM信号,请求它们退出。我们也可以使用信号编号来指定信号,如:

[linux@bashcommandnotfound.cn ~]$ fuser -k -S 15 test.txt

这与上面的命令等效,因为SIGTERM的信号编号是15。

实例6:查找哪些进程正在使用某个文件系统

假设我们有一个文件系统/dev/sda1,我们想知道哪些进程正在使用它,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ fuser -m /dev/sda1

输出结果类似于:

/dev/sda1: 1234m 5678m 9012m

这表示有三个进程,分别是1234、5678和9012,正在使用/dev/sda1文件系统。注意,输出结果中的m表示进程使用该文件进行内存映射,抑或该文件为共享库文件,被进程映射进内存。如果我们加上-v选项,我们还可以看到进程的详细信息,如:

[linux@bashcommandnotfound.cn ~]$ fuser -v -m /dev/sda1

输出结果类似于:

                     USER        PID ACCESS COMMAND
/dev/sda1:           root       1234 ..c.. systemd
                     root       5678 ..c.. sshd
                     bob        9012 ..c.. bash

这表示1234进程是root用户运行的systemd命令,5678进程是root用户运行的sshd命令,9012进程是bob用户运行的bash命令。

实例7:终止使用某个文件系统的所有进程

假设我们有一个文件系统/dev/sda1,我们想终止所有使用它的进程,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ fuser -k -m /dev/sda1

这会向使用/dev/sda1文件系统的进程发送SIGKILL信号,强制终止它们。如果我们加上-i选项,我们还可以在终止进程之前,要求用户确认,如:

[linux@bashcommandnotfound.cn ~]$ fuser -k -i -m /dev/sda1

输出结果类似于:

/dev/sda1: 1234m 5678m 9012m
Kill process 1234 ? (y/N) y
Kill process 5678 ? (y/N) y
Kill process 9012 ? (y/N) y

这会让用户选择是否终止每个进程。

实例8:发送信号给使用某个文件系统的所有进程

假设我们有一个文件系统/dev/sda1,我们想向所有使用它的进程发送SIGUSR1信号,让它们执行某些自定义的操作,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ fuser -k -S USR1 -m /dev/sda1

这会向使用/dev/sda1文件系统的进程发送SIGUSR1信号,触发它们的信号处理函数。我们也可以使用信号编号来指定信号,如:

[linux@bashcommandnotfound.cn ~]$ fuser -k -S 10 -m /dev/sda1

这与上面的命令等效,因为SIGUSR1的信号编号是10。

实例9:查找哪些进程正在使用某个UDP套接字

假设我们有一个UDP套接字,端口号为53,我们想知道哪些进程正在使用它,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ fuser -n udp 53

输出结果类似于:

53/udp: 1234

这表示有一个进程,即1234,正在使用53端口的UDP套接字。如果我们加上-v选项,我们还可以看到进程的详细信息,如:

[linux@bashcommandnotfound.cn ~]$ fuser -v -n udp 53

输出结果类似于:

                     USER        PID ACCESS COMMAND
53/udp:              root       1234 F.... named

这表示1234进程是root用户运行的named命令。

实例10:查找哪些进程正在使用某个IPv4套接字

假设我们有一个IPv4套接字,地址为127.0.0.1:80,我们想知道哪些进程正在使用它,我们可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ fuser -n 4 127.0.0.1:80

输出结果类似于:

127.0.0.1:80/4: 1234 5678

这表示有两个进程,分别是1234和5678,正在使用127.0.0.1:80地址的IPv4套接字。如果我们加上-v选项,我们还可以看到进程的详细信息,如:

[linux@bashcommandnotfound.cn ~]$ fuser -v -n 4 127.0.0.1:80

输出结果类似于:

                     USER        PID ACCESS COMMAND
127.0.0.1:80/4:      root       1234 F.... nginx
                     www-data   5678 F.... nginx

这表示1234进程是root用户运行的nginx命令,5678进程是www-data用户运行的nginx命令。

Linux fuser命令的注意事项

以下是一些使用fuser命令时需要注意的事项:

  • fuser命令需要root权限或者对指定文件的访问权限才能正常工作,否则会显示错误信息,如:
[linux@bashcommandnotfound.cn ~]$ fuser test.txt
fuser: failed to open test.txt: Permission denied
  • fuser命令只能查找本地文件系统中的文件,不能查找远程文件系统中的文件,否则会显示错误信息,如:
[linux@bashcommandnotfound.cn ~]$ fuser /mnt/nfs/test.txt
fuser: /mnt/nfs/test.txt: No such file or directory
  • fuser命令不能查找特殊文件,如设备文件、管道文件、符号链接等,否则会显示错误信息,如:
[linux@bashcommandnotfound.cn ~]$ fuser /dev/null
fuser: /dev/null: No such file or directory
  • fuser命令在终止进程时,可能会影响到其他使用同一文件的进程,所以要谨慎使用-k选项,或者使用-i选项来确认。另外,如果使用-S选项来发送信号,要注意不同的信号有不同的效果,有些信号可能会导致进程异常退出或者忽略信号。

  • 如果你的系统没有fuser命令,你可能会看到以下错误信息:

[linux@bashcommandnotfound.cn ~]$ fuser test.txt
bash: fuser: command not found

这时,你需要安装psmisc包,或者使用你的系统的包管理工具来安装fuser命令。

Linux fuser命令的快捷键

fuser命令没有特殊的快捷键,但是你可以使用一些通用的快捷键来方便地使用fuser命令,例如:

  • 使用Ctrl+C来中断fuser命令的执行
  • 使用上下箭头键来浏览历史的fuser命令
  • 使用Tab键来自动补全文件名或者选项

Linux fuser相关命令

以下是一些与fuser命令相关的命令,你可以使用它们来进一步了解和管理文件和进程:

0

评论区