博学笃行·盛德日新

Linux之fuser帮助文档翻译


技术 linux 命令

0x01 fuser简介

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

0x02 fuser语法

fuser [-a|-s|-c] [-4|-6] [-n space ] [-k [-i] [-signal ] ] [-muvf] filename 
fuser -l 
fuser -V

0x03 fuser描述

fuser显示正在占用指定的文件或文件系统的进程号(pid). 默认的显示模式下, 每个文件名使用一个表示访问类型的字母展示, 如下:

c    当前目录(current directory)
e    正在运行的可执行程序(excutable being run)
f    打开文件. f 在默认显示模式下是忽略的.
F    打开并正在写入文件. F 在默认显示模式下是忽略的.
r    根目录(root directory)
m    映射的文件或共享的库

fuser指定的文件没有进程使用时或遇到一个致命错误的时候,返回一个非0状态码. 如果至少一个进程访问了该文件,则返回0.

为了查看使用TCP或者UDP套接字的进程, 需要使用-n选项的对应的名字空间. 默认情况下, fuser 将会查看IPv6和IPv4套接字. 使用 -4-6 选项改变默认值. 这个套接字可以被指定为本地或远程端口, 远程地址. 所有的字段都是可选的, 但是对应的忽略的字段的逗号不可以省略:
[lcl_port][,[rmt_host][,[rmt_port]]]

符号或者数字值可以被用于ip地址和端口号.

fuser仅仅输出PID到标准输出, 其他的所有都发送给了标准错误文件描述符.

0x04 fuser 选项

选项 描述
-a 显示命令行里指定的所有文件. 默认仅显示那些至少被一个进程访问的文件
-c -m选项, 用于和POSIX兼容
-f 安静模式, 用于POSIX兼容
-k 杀死所有使用这个文件的进程. 除非被 -signal 选项改变, 不然的话发送一个SIGKILL的信号给进程. fuser不可以杀死自己的进程, 但是可以杀死其他的fuser进程. 在尝试杀死正在执行fuser命令进程时, 如果是有效用户标识符(effective user ID)则会使用真实用户标识符(real user ID)来处理.
-i 在杀死一个进程前需要用户确认. 需要和-k选项同时使用.
-l 列出所有知道的信号名字
-m 指定文件所在的文件系统或挂载的块设备. 所有使用改文件系统或块设备的进程都会被列出. 如果指定的是一个目录, 则会自动添加»/«, 并坚持目录所在的文件系统.
-n space 选择一个不同的命名空间. 支持file(文件名, 默认), udp(本地的UDP端口), 和tcp(本地TCP端口). 针对端口, 支持端口号或者对应端口名字. 在没有歧义的情况下, 可以使用快速标记 name/space(如:80/tcp)
-s 安静模式, 该选项将会忽略-u-v选项. -a选项不能和-s选项共用.
-signal 在杀死进程时使用指定的信号来替换SIGKILL信号. 信号可以使用指定的名字(如:-HUP)或者数字(如:-1). 该选项需要和-k选项一起使用.
-u 显示每个进程的用户名
-v 详细模式. 进程会像ps命令类似的输出模式. PID, USER, COMMAND字段意思和ps命令输出类似. ACCESS显示进程是如何访问这个文件的. 如果文件是被内核访问(如: 挂载点, 交换文件等), PID这列会显示为kernel.
-V 显示版本号.
-4 仅搜寻IPv4的套接字. 这个选项不可以和-6选项同时使用. 仅仅对tcpudp命名空间有效.
-6 仅搜寻IPv6的套接字. 这个选项不可以和-4选项同时使用. 仅仅对tcpudp命名空间有效.
- 重置所有选项, 并将信号设置回SIGKILL.

0x05 fuser 示例

fuser -km /home 杀死所有使用/home目录的进程.
if fuser -s /dev/ttyS1; then :; else something; fi 当没有进程在使用/dev/ttyS1时触发somethine.
fuser telnet/tcp 显示使用本地TELNET端口的所有进程.

0x06 fuser 的限制性

进程使用同样的方法多次访问同一个文件或文件系统将只会被显示一次.

如果同一个对象在命令行中被指定多次, 一些条目将会被忽略. (译者表示没明白, 不知道什么场景下会触发.)

fuser除非以特权运行, 否则可能只能收集部分信息. 因此, 可能不会列出属于其他用户的进程打开的文件, 并且可执行文件可能仅被分类为映射.

使用SUID 到 root 的方式来安装fuser可以避免只能获取部分信息的问题, 但出于安全和隐私原因可能你并不会想要这么做.

udptcp命名空间, 和UINX 域套接字在内核低于1.3.78的情况下不可用.
udptcp可以在IPv6和IPv4下使用, 但是ip地址字段只可以使用IPv4的地址.

被内核访问的进程只有在-v选项下显示.

-k选项只在进程上起作用. 如果用户是内核, fuser会打印出一个设备, 但不会有其他操作.

0x07 fuser注意事项

7.1 使用环境

本文介绍的fuser仅适用于linux, 在macOS下, fuser命令相关参数不同.

7.2 如果只想知道进程的pid

如果只想知道进程的pid,也可以使用pidof命令

7.3 在CentOS / RHEL 7上找不到fuser命令

出现如下报错:

-bash: fuser: command not found

使用如下命令安装

yum install psmisc

0x08 参考

  1. IBM知识中心
  2. tutorialspoint

评论