fuser 是什么
fuser 通过扫描 /proc 找出「谁在用这个文件、目录、挂载点或端口」,可以把它理解成面向使用者的反向查询:不是问「这个进程打开了什么」,而是问「这个东西被谁占着」。它还支持直接向占用者发信号,处理 device is busy 这类卸载失败场景时效率很高。
基本信息
| 适用平台 | Linux/Unix(psmisc 包) |
|---|---|
| 命令语法 | fuser [选项] 名称...(名称可以是文件、目录、挂载点或 端口/协议) |
| 常用选项 | -m 把目录当作挂载点处理 -v 显示详细列表 -k 向占用者发信号 -i 发信号前交互确认 -s 静默 -u 显示用户名 |
| 端口写法 | fuser 8080/tcp 表示查询 TCP 8080 |
| 权限说明 | 看到其它用户的进程通常需要 root |
典型使用场景
- 卸载失败:umount 报 device is busy,先查是谁占着挂载点
- 清理现场:确认某个目录被哪些进程打开,再决定如何处置
- 端口排查:确认端口被哪些进程监听或连接
- 发布与重启:升级前确认旧进程确实退出了
- 定位日志写入者:确认哪个进程还握着被删除的文件句柄
常用示例
常用示例
fuser -mv /data # 详细列出占用 /data 的进程与访问方式
fuser -m /data # 只输出 PID,便于脚本处理
fuser -k -m -TERM /data # 先优雅终止占用者
fuser -ki /data # -i 逐个交互确认再发信号
fuser 8080/tcp # 谁在监听或连接 8080
fuser -v --mount /data # 与 -mv 等价的明确写法输出标记读法
| 标记 | 含义 | 说明 |
|---|---|---|
| c | 该进程把此目录作为当前工作目录 | 常见于在目录内启动的服务 |
| e | 可执行文件正在运行 | 指的是该文件被当作程序启动 |
| f | 打开的文件 | 默认的普通打开情形 |
| F | 以写方式打开的文件 | F 大写表示可写 |
| r | 根目录 | 该进程把此目录当作根 |
| m | 内存映射的文件或共享库 | 常见于进程加载了这个库 |
fuser -k 会直接向占用者发送信号,默认 SIGKILL:这在生产环境等于是无预警强杀。正确顺序是先 fuser -mv 看清对象、确认业务影响,再用 -TERM 优雅终止,必要时加 -i 逐个确认,最后才考虑强杀。
对目录要理解 -m 的含义:它把路径当作挂载点,覆盖该挂载点内所有文件的使用者,而不是只查目录本身被谁当作工作目录。想精确查某一个文件,去掉 -m 即可,两者语义不同。
-k 可以指定要发的信号而不只是强杀:fuser -k -HUP /path 让守护进程重载配置,fuser -k -TERM /path 请求优雅退出。给服务类进程发信号时,先想清楚它对该信号的处理方式,再决定用哪一个。