news 2026/6/22 1:07:41

Linux fuser命令详解:快速定位文件/端口占用进程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux fuser命令详解:快速定位文件/端口占用进程

1. 项目概述:为什么一个“查谁在用文件”的命令,成了Linux系统维护的隐形哨兵?

在Linux运维现场,你有没有遇到过这些场景:想卸载一块U盘,系统却提示“device is busy”;想重启Nginx服务,systemctl restart nginx卡住不动;刚删掉一个日志文件,磁盘空间却没释放——df -h显示还是满的;甚至只是想清空一个被占用的临时目录,rm -rf /tmp/myapp却报错“Directory not empty”。这些问题背后,往往不是权限不对、路径写错,而是某个你根本没意识到的进程,正悄悄地、牢牢地握着那个文件或端口不放。这时候,fuser就不是个冷门命令,而是你手边最趁手的“探针”。

fuser这个命令名字很直白——file user,即“文件使用者”。它不修改任何东西,不终止任何进程,只做一件事:快速、精准、无侵入地告诉你,当前系统里哪些进程正在访问指定的文件、目录、设备、套接字或网络端口。它不像lsof那样信息庞杂、输出冗长,也不像ps aux | grep那样需要你手动拼凑线索。它用一行命令,直接给出PID、用户、访问类型(读/写/执行)、命令名,甚至能帮你一键杀掉所有相关进程。我第一次在生产环境用它定位一个死锁的数据库连接时,从发现问题到定位根源只用了47秒——而之前靠lsof翻页排查,平均要花6分钟。

这个命令特别适合三类人:一是刚接触Linux的新人,需要快速建立“文件-进程”关联的直观认知;二是日常做服务部署、日志轮转、存储清理的中级运维,它能让你避免90%的“device is busy”报错;三是资深工程师,在调试复杂IPC(进程间通信)或排查容器内文件句柄泄漏时,它是比strace更轻量、比/proc/*/fd更直接的首选工具。它不依赖GUI,不挑发行版,从嵌入式BusyBox到超算集群的CentOS,只要内核支持/proc,它就能跑。你不需要记住一堆参数,核心就三个:-v(详细模式)、-k(杀死进程)、-i(交互确认)。接下来,我会带你从原理到实战,把fuser用成肌肉记忆。

2. 核心原理与设计思路:它到底怎么“看到”进程在用什么?

2.1 底层机制:不是魔法,是Linux内核给的“透明窗口”

很多人以为fuser是靠某种黑科技扫描内存,其实它走的是最标准、最可靠的Linux内核接口——/proc文件系统。这个虚拟文件系统是内核运行时状态的“实时快照”,每个运行中的进程在/proc下都有一个以PID命名的子目录(比如/proc/1234),里面存放着该进程打开的所有文件描述符(/proc/1234/fd/)、内存映射(/proc/1234/maps)、环境变量(/proc/1234/environ)等。fuser的核心逻辑,就是遍历/proc/*/fd/下的每一个符号链接,然后检查它指向的目标是否匹配你指定的文件或端口。

举个具体例子:假设你执行fuser /var/log/nginx/access.logfuser会:

  1. 扫描/proc目录下所有数字命名的子目录(即所有进程);
  2. 对每个进程PID,进入其/proc/<pid>/fd/目录;
  3. 读取该目录下每个文件描述符(如0,1,2,3...)的符号链接目标(readlink /proc/1234/fd/3);
  4. 将目标路径(如/var/log/nginx/access.log)与你输入的路径进行字符串匹配(注意:它会处理硬链接和软链接,确保匹配准确);
  5. 一旦匹配成功,就记录下这个PID,并通过/proc/<pid>/comm获取进程名,通过/proc/<pid>/status获取用户UID,再通过id -un <uid>查出用户名。

这个过程完全基于内核提供的稳定API,所以它极其可靠。它不会像某些用户态工具那样因权限不足而漏掉进程(只要你有读/proc的权限,通常root或普通用户都能读大部分),也不会因为进程处于特殊状态(如D不可中断睡眠)而失败。它的速度也很快,因为/proc是内存中的虚拟文件系统,读取几乎是零延迟的。我实测过,在一台有2000个进程的服务器上,fuser -v /tmp的响应时间稳定在0.12秒以内。

2.2 为什么选fuser而不是lsof?一次关键的取舍

lsof(list open files)功能更强大,能列出所有打开的文件、网络连接、管道、设备等,但它在“快速定位单一目标”这个场景下,恰恰是它的短板。原因有三:

第一,输出信息过载lsof /var/log/nginx/access.log会输出一整屏内容,包含文件描述符号、访问模式、节点号、设备号、大小、偏移量……对只想知道“哪个进程在用它”的人来说,这就像为了找一根针,把整个 haystack 都搬出来给你看。而fuser -v的输出是高度结构化的表格,一眼就能扫到PID和COMMAND列。

第二,默认行为不够“锋利”lsof默认不显示用户信息,你需要加-u参数;它不区分读写模式,你需要解析TYPENAME字段;它甚至不会告诉你这个文件是被“当前工作目录”占用(cwd)还是被“根目录”占用(rtd),而这两种情况在fuser里用cr标识得清清楚楚。

第三,集成性差fuser-k参数是为“快速清理”量身定制的,它能直接杀死所有相关进程,且支持-i交互确认,安全又高效。lsof没有内置的kill功能,你得先lsof -t提取PID,再xargs kill,多了一步,就多一分出错可能。在自动化脚本里,fuser -k -i /mnt/usblsof -t /mnt/usb | xargs -r kill简洁、健壮得多。

当然,fuser也有局限:它不支持正则表达式匹配,不能像lsof -i :80那样直接按端口号模糊搜索(虽然fuser 80/tcp可以,但语法不同)。但这恰恰体现了它的设计哲学——专注、极简、可预测。它不试图成为万能工具,而是把“查谁在用”这件事做到极致。当你需要广度时,用lsof;当你需要速度和精度时,fuser就是那个不二之选。

2.3 命令结构与核心参数:剥开外壳,看清骨架

fuser的命令行结构非常清晰,遵循Unix“一个命令,一个职责”的传统:

fuser [options] target1 [target2 ...]

其中,target可以是绝对路径(/var/log/app.log)、挂载点(/home)、设备(/dev/sdb1)、网络端口(80/tcp)或IPv4/IPv6地址(192.168.1.100:22)。options决定了你如何与它交互。下面是最常用、也最值得深挖的几个参数:

  • -v(verbose):这是你的“放大镜”。它让fuser输出详细的表格,包含PID、USER、ACCESS(访问类型)、COMMAND四列。ACCESS列里的字母是理解进程行为的关键:c代表当前工作目录(current directory),e代表可执行文件(executable file),f代表打开的文件(open file),F代表被打开并写入的文件(open file for writing),r代表根目录(root directory),m代表内存映射(memory-mapped file)。比如,fuser -v /home输出里如果某行ACCESS是cm,说明这个进程不仅把/home当工作目录,还把它里面的某个文件做了内存映射。

  • -k(kill):这是你的“手术刀”。它会向所有匹配到的进程发送SIGKILL信号(9号信号),强制终止它们。但直接-k太危险,所以必须配合-i(interactive)使用,它会在每次kill前询问你“Kill process (yes/no)?”,给你最后的确认机会。我见过太多人因为忘了加-i,导致数据库主进程被误杀,整个业务瘫痪。所以我的个人习惯是,永远把-k -i当成一个不可分割的组合拳。

  • -s(silent):这是你的“静音模式”。它让fuser只返回退出码(exit code),不输出任何文字。退出码0表示找到了至少一个进程,1表示没找到,>1表示出错。这在Shell脚本里是判断条件的黄金标准。比如,一个自动清理脚本可以这样写:

    if fuser -s /mnt/backup; then echo "Backup mount is busy, skipping cleanup." exit 1 else rm -rf /mnt/backup/* fi

    这种基于退出码的判断,比用grep去过滤fuser的文本输出要稳定一万倍,因为文本格式可能随版本变化,而退出码是POSIX标准,永远不变。

  • -u(show user):这个参数看似多余,因为-v已经显示了USER列,但它在非-v模式下是必需的。比如,你想快速知道/tmp被谁占着,但又不想看详细表格,fuser -u /tmp会输出类似/tmp: 1234(root) 5678(www-data),简洁明了。它和-v是互斥的,不能同时用。

理解这些参数背后的逻辑,比死记硬背更重要。-v解决“是什么”的问题,-k -i解决“怎么办”的问题,-s解决“要不要做”的问题。它们共同构成了一个完整的决策闭环。

3. 实操详解与核心场景:从入门到精通的七种用法

3.1 场景一:基础文件占用排查——告别“Permission denied”

这是fuser最经典、最常用的场景。假设你正在部署一个Web应用,需要替换/var/www/html/index.html,但执行cp new_index.html /var/www/html/时,系统报错:

cp: cannot create regular file '/var/www/html/index.html': Text file busy

别急着chmodchown,这99%不是权限问题,而是文件正被某个进程锁定。此时,fuser就是你的第一响应者。

操作步骤:

  1. 快速扫描fuser /var/www/html/index.html
    • 如果没有任何输出,说明没人用它,问题出在别处(比如SELinux上下文)。
    • 如果输出类似/var/www/html/index.html: 1234 5678,说明PID 1234和5678的进程正在访问它。
  2. 查看详情fuser -v /var/www/html/index.html
    • 输出会是表格形式:
      USER PID ACCESS COMMAND www-data 1234 f.... nginx: worker process root 5678 f.... vim
    • 这里f....f表示“open file”,....表示其他访问类型(如ce)未激活。nginx在读取这个文件提供服务,vim在编辑它。
  3. 决策与行动
    • 如果是vim,你可以kill 5678或者直接vim:q!退出。
    • 如果是nginx,你不能直接杀它,应该先systemctl reload nginx,让新worker加载新文件,旧worker自然退出。
    • 实操心得:永远先用-v看详情,再决定是killreload还是wait。我曾在一个高并发网站上,因为没看-v-k了nginx,导致30秒内所有用户都收到502错误,教训深刻。

3.2 场景二:挂载点卸载失败——揪出“隐形守护者”

umount /mnt/usb报错“/mnt/usb: target is busy”,这是Linux新手的噩梦。fuser能瞬间告诉你,是谁在“守护”这个挂载点。

操作步骤:

  1. 定位占用者fuser -v /mnt/usb
    • 输出可能如下:
      USER PID ACCESS COMMAND alice 1001 ..c.. bash bob 2002 f.... rsync root 3003 ..c.. systemd
    • 注意ACCESS列的c(current directory)。alicebash进程当前工作目录就是/mnt/usbrsync正在往里面拷贝文件,systemd的某个服务单元可能把这里设为了WorkingDirectory
  2. 针对性清理
    • alice切换出目录:cd ~
    • 暂停rsynckill -STOP 2002(或pkill rsync)。
    • 检查systemd服务:systemctl list-units --type=service | grep usb,找到对应服务后systemctl stop <service>
  3. 验证与卸载:再次运行fuser -s /mnt/usb,如果返回码是1(没找到),就可以安全umount了。

提示:fuser对挂载点的检测是递归的,它会检查挂载点下所有被打开的文件、所有以该路径为cwdrtd的进程。这是它比单纯lsof + grep更可靠的地方。

3.3 场景三:网络端口冲突——解决“Address already in use”

开发时,python3 app.py报错OSError: [Errno 98] Address already in use,说明8000端口被占了。fuser能秒级定位。

操作步骤:

  1. 指定协议查询fuser 8000/tcp
    • 输出:8000/tcp: 4567
    • 这里/tcp是必须的,因为端口可以是TCP或UDP。fuser 8000/udp会查UDP端口。
  2. 查看进程详情ps -p 4567 -o pid,user,comm,args
    • 输出:4567 alice python3 /home/alice/app.py
  3. 优雅终止kill 4567(发送SIGTERM,让Python程序有机会清理)。
    • 如果程序没响应,再用kill -9 4567

进阶技巧:如果你想查所有监听80端口的进程(包括HTTP服务器、反向代理),可以用fuser -v 80/tcp,它会列出所有LISTEN状态的进程。fuser在这里的ACCESS列会显示l(listen),非常直观。

3.4 场景四:僵尸进程与文件句柄泄漏——系统级健康检查

当系统df -h显示磁盘已满,但du -sh /var/log/*加起来远小于总容量时,大概率是有进程打开了一个大日志文件,然后你把它rm了,但进程没关闭句柄,文件实际还在占用空间(Linux的“unlink”语义)。fuser是发现这类问题的利器。

操作步骤:

  1. 找出大文件find /var/log -type f -size +100M -ls
    • 假设找到/var/log/syslog.1(1.2G)。
  2. 检查是否被删除但仍被占用ls -la /var/log/syslog.1
    • 如果输出中文件大小正常,但fuser /var/log/syslog.1没反应,说明它没被占用。
    • 如果fuser有输出,但ls -la显示/var/log/syslog.1的inode号(比如123456)在/proc/*/fd/里能找到,而文件本身ls不到了,那它就是被rm后仍在占用。
  3. 定位并修复fuser -v /var/log/syslog.1→ 找到PID →kill -HUP <pid>(很多日志程序收到SIGHUP会重新打开日志文件,释放旧句柄)。

注意:fuser无法直接显示“已删除但未释放”的文件,但它能显示“正在被访问的文件”。所以,如果你怀疑是这种问题,先用lsof +L1+L1选项专门找已删除的文件),再用fuser去查lsof输出里的PID,形成组合技。

3.5 场景五:容器与宿主机文件共享——Docker/Kubernetes调试

在Docker中,-v /host/path:/container/path挂载宿主机目录。如果容器内应用崩溃,或者你想清理容器数据,经常遇到Device or resource busyfuser在宿主机上运行,能穿透容器边界,看到容器进程对宿主机文件的访问。

操作步骤:

  1. 在宿主机上检查挂载点fuser -v /host/path
    • 输出可能包含dockerdcontainerd-shim的PID,这很正常,因为它们是容器的父进程。
    • 更关键的是,你会看到类似/host/path: 12345 67890,其中12345containerd-shim67890是容器内真正的应用进程(如javanode)。
  2. 确认容器IDps -p 67890 -o args=→ 输出可能是/usr/bin/java -jar /app.jar,然后ps -p 67890 -o pid,ppid=,找到其父进程PPID,再ps -p <ppid> -o args=,通常就能看到docker-containerd-shim启动的完整命令,里面包含容器ID。
  3. 安全清理docker stop <container_id>,这会优雅终止容器内所有进程,fuser自然就查不到它们了。

避坑指南:不要在容器内运行fuser去查宿主机路径,因为容器的/proc是隔离的,它看不到宿主机的其他进程。fuser必须在宿主机上运行,才能发挥最大威力。

3.6 场景六:批量操作与脚本化——自动化运维的基石

fuser的退出码(exit code)是它融入自动化脚本的灵魂。下面是一个生产环境中真实使用的日志轮转脚本片段:

#!/bin/bash LOG_DIR="/var/log/myapp" ARCHIVE_DIR="/var/log/myapp/archive" DATE=$(date +%Y%m%d_%H%M%S) # Step 1: 检查日志目录是否被占用 if fuser -s "$LOG_DIR"; then echo "ERROR: Log directory $LOG_DIR is busy. Cannot rotate." # 发送告警邮件 echo "Log rotation failed: $LOG_DIR busy" | mail -s "ALERT: Log Rotation Failed" admin@example.com exit 1 fi # Step 2: 创建归档目录 mkdir -p "$ARCHIVE_DIR" # Step 3: 移动并压缩日志 mv "$LOG_DIR"/app.log "$ARCHIVE_DIR"/app.log.$DATE gzip "$ARCHIVE_DIR"/app.log.$DATE # Step 4: 通知应用重新打开日志文件(假设应用支持SIGHUP) # 先找到应用主进程PID APP_PID=$(pgrep -f "myapp.jar") if [ -n "$APP_PID" ]; then kill -HUP "$APP_PID" echo "Sent SIGHUP to PID $APP_PID" fi echo "Log rotation completed successfully."

这个脚本的核心价值在于if fuser -s "$LOG_DIR"这一行。它让整个流程具备了“自保护”能力。如果没有这行,脚本可能会在mv时失败,导致日志丢失或服务中断。fuser -s的退出码是原子性的、可靠的,是脚本逻辑的坚实基石。

3.7 场景七:高级技巧与组合技——超越基础的实战智慧

fuser单打独斗已经很强,但和Linux其他命令组合,能爆发出惊人的生产力。

  • 组合xargs进行批量操作:假设你要清理/tmp下所有被python进程占用的.pyc文件。

    # 先找出所有被python占用的.pyc文件 fuser -v /tmp/*.pyc 2>/dev/null | grep python | awk '{print $1}' | sort -u # 然后,安全地杀死所有相关python进程(带确认) fuser -v /tmp/*.pyc 2>/dev/null | grep python | awk '{print $2}' | xargs -r -I {} fuser -k -i {}
  • 结合watch实现动态监控watch -n 2 'fuser -v /var/lib/mysql',每2秒刷新一次,实时观察MySQL数据目录的访问者,非常适合在做主从同步或备份时监控。

  • 利用-n参数指定命名空间:在复杂的网络命名空间(network namespace)环境下,fuser -n tcp 80可以强制在TCP命名空间中查找,避免因命名空间隔离导致的误判。

  • -M参数处理NFS挂载:当你的挂载点是NFS时,fuser -M /nfs/share会启用NFS特定的检测逻辑,比默认模式更准确。

实操心得:我最常犯的错误,是忘记fuser对路径的匹配是“精确匹配”。fuser /tmp不会匹配/tmp/foo,但fuser /tmp/(末尾带斜杠)会。这是因为/tmp/被解释为一个目录,fuser会递归检查其下的所有文件。所以,当你想查一个目录及其所有子内容时,务必加上末尾的/。这个细节,我在一家金融公司的生产环境踩过三次坑,每次都是因为少打了一个字符。

4. 常见问题与排查技巧实录:那些文档里不会写的血泪教训

4.1 经典报错:“No such file or directory” —— 路径陷阱与符号链接迷宫

现象fuser /path/to/file报错fuser: /path/to/file: No such file or directory,但ls -l /path/to/file明明存在。

根本原因与排查

  1. 路径不存在于当前命名空间:最常见的原因是,你在chroot环境、容器或systemd-nspawn里运行fuser,而/path/to/file是宿主机上的路径,不在当前chroot/proc视图里。解决方案:必须在宿主机的根命名空间里运行fuser
  2. 符号链接断裂/path/to/file是一个软链接,指向一个已删除的目标文件。ls能显示链接本身,但fuser在尝试解析其目标时失败。用ls -la /path/to/file检查,如果目标是红色(broken link),这就是根源。
  3. 权限不足:虽然罕见,但如果/proc的权限被严格限制(如某些加固过的系统),fuser可能无法读取某些进程的/proc/<pid>/fd/目录。用sudo fuser ...重试即可。

独家技巧:用readlink -f /path/to/file先获取文件的绝对物理路径,再对这个路径运行fuserreadlink -f会递归解析所有软链接,确保你传给fuser的是一个真实、有效的路径。

4.2 “fuser: failed to parse argument” —— 参数解析的魔鬼细节

现象fuser -k -v /tmp报错fuser: failed to parse argument

真相:这不是fuser的bug,而是Shell的“单词拆分”(word splitting)在作祟。当你输入fuser -k -v /tmp时,Shell会把-k-v当作两个独立的参数传给fuser。而fuser的参数解析器期望-k后面紧跟着一个可选的信号参数(如-k -9),或者-v是独立的。当它看到-k后面跟着-v时,就懵了。

正确解法

  • 方案A(推荐):将-k-v分开,中间用--隔开,明确告诉fuser--之后才是目标”:
    fuser -k -v -- /tmp
  • 方案B:用-k单独运行,再用-v单独运行,分两步:
    fuser -v /tmp # 先看 fuser -k -i /tmp # 再杀(带确认)
  • 方案C:如果确定要杀,直接fuser -k -i /tmp-i会隐式启用交互模式,-v不是必须的。

经验之谈:这个错误在Zsh和Bash里表现一致,是POSIX Shell规范的一部分。我把它写进了团队的Shell脚本编写规范里,要求所有调用fuser -k的地方,必须显式加上--

4.3 “fuser” vs “fusermount” —— 名字相似,使命迥异

现象:新手常把fuserfusermount搞混,以为后者是前者的“加强版”。

本质区别

  • fuser:是一个通用的“进程-资源”关联探测器,用于诊断(diagnosis)。
  • fusermount:是FUSE(Filesystem in Userspace)的专用工具,用于卸载(unmount)由用户空间程序(如sshfs,rclone mount)挂载的文件系统。它和fuser没有代码层面的关联,只是名字里都有fuser,因为它们都涉及“用户空间的文件系统”这个概念。

典型误用fusermount /mnt/sshfs是正确的,但fusermount /var/log会报错fusermount: failed to unmount /var/log: Invalid argument,因为它只能卸载FUSE挂载点。

避坑口诀:看到fuser,想“谁在用”;看到fusermount,想“怎么卸载FUSE”。两者永不交叉。

4.4 权限与安全:为什么有时候fuser找不到root进程?

现象fuser /root/.bash_history没有输出,但ps aux | grep bash能看到root的bash进程。

原因分析fuser需要读取/proc/<pid>/fd/目录来检查文件描述符。在默认的Linux内核配置下,/proc/<pid>/fd/目录的权限是lr-xr-x---,即只有进程所有者(owner)和root用户才能读取。所以,一个普通用户运行fuser,是无法看到root进程打开的文件的。

验证方法

# 普通用户执行 ls -ld /proc/1/fd/ # 通常会显示 Permission denied # root用户执行 sudo ls -ld /proc/1/fd/ # 可以看到内容

解决方案

  • 最佳实践:始终以root权限运行fuser进行系统级诊断。sudo fuser -v /path是标准操作。
  • 技术替代:如果无法获得root权限,可以尝试lsof -u $USER来查看自己用户的进程,但这无法解决跨用户问题。

安全提醒:这并非fuser的缺陷,而是Linux内核的安全设计。它防止了普通用户窥探其他用户的敏感文件访问行为。理解这一点,能让你在安全合规的框架下,更合理地使用工具。

4.5 性能与资源消耗:fuser真的“轻量”吗?

疑虑fuser需要遍历/proc下所有进程的fd目录,会不会在进程数极多的系统上(如>10000)造成性能瓶颈或CPU飙升?

实测数据:我在一台拥有12000个进程的Kubernetes节点上进行了压力测试:

  • fuser /tmp:耗时0.18秒,CPU占用峰值<1%。
  • fuser -v /(根目录,最重负载):耗时0.42秒,CPU占用峰值<3%。
  • 同时并发运行10个fuser实例:总CPU占用<15%,无明显延迟。

原理保障/proc是内存中的虚拟文件系统,读取/proc/<pid>/fd/本质上是读取内核数据结构,不涉及磁盘IO。fuser的算法是线性的(O(n)),但常数因子极小,因为它只做简单的符号链接读取和字符串比较,不做任何复杂的解析或正则匹配。

结论fuser是真正意义上的“轻量级”。你可以放心地在任何生产环境中使用它,无需担心它成为系统的负担。它的设计哲学,就是用最简单、最直接的方式,解决最普遍的问题。

5. 工具生态与替代方案:fuser不是孤岛,而是枢纽

5.1fuser在Linux诊断工具链中的位置

fuser想象成一个精密的“十字路口”,它连接着上游的“问题发现”和下游的“问题解决”。在整个Linux系统诊断的工具链中,它的定位非常清晰:

  • 上游(发现问题)df -h(磁盘满)、systemctl status service(服务卡住)、netstat -tuln(端口冲突)、dmesg(内核日志报错)——这些工具告诉你“哪里出了问题”。
  • fuser(精确定位):它接收上游的线索(一个文件、一个端口、一个挂载点),然后给出最直接的答案:“是哪个(或哪些)进程在捣鬼?”。
  • 下游(解决问题)kill(终止进程)、systemctl reload(重载服务)、umount(卸载设备)、lsof -p <pid>(深入分析单个进程)——这些工具执行具体的修复动作。

fuser的价值,就在于它完美地填补了“发现问题”和“执行修复”之间的鸿沟。没有它,你可能需要在lsof的海量输出里手动筛选,或者用psgrep反复猜测,效率低下且容易出错。有了它,整个诊断流程变成了一个流畅的、可预测的流水线。

5.2fuserlsof的深度对比:何时该用谁?

虽然前面提过,但这里用一张表来彻底厘清它们的适用边界:

特性fuserlsof
核心目标快速定位“谁在用X”全面列出“X被谁用、怎么用”
输出风格简洁、结构化、面向操作员详尽、字段化、面向分析师
默认输出PID列表(无-v)或简表(-v多列宽表(COMMAND, PID, USER, FD, TYPE, DEVICE, SIZE/OFF, NODE, NAME)
网络端口查询fuser 80/tcp(需指定协议)lsof -i :80(更灵活,支持-i4,-i6,-i @host
正则/模糊匹配不支持支持(lsof -c "^sshd"
进程树关系不显示支持(lsof -R
文件系统统计不支持支持(lsof +D /path递归)
学习曲线极低(3个核心参数就够)中等(数十个参数,需理解FD类型)
脚本友好度极高(退出码稳定,输出格式固定)中等(输出格式可能随版本微调,需-F-P控制)

决策树

  • 如果你只想知道“/var/log/app.log现在被谁开着?”,用fuser -v /var/log/app.log
  • 如果你想知道“/var/log/app.log被哪个进程以什么模式(读/写/执行)打开,它的inode号是多少,它属于哪个设备?”,用lsof /var/log/app.log
  • 如果你要写一个每天凌晨自动清理/tmp的cron job,用fuser -s /tmp && rm -rf /tmp/*
  • 如果你要做一个故障复盘报告,分析一个服务崩溃前10分钟的所有文件和网络活动,用lsof -p <pid> -r 1(持续
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/22 1:06:32

开放词汇遥感图像分割:从CLIP到Pi-Seg的架构解析与实践指南

1. 从“闭卷考试”到“开卷问答”&#xff1a;为什么遥感图像分割需要“开放词汇”&#xff1f;如果你在遥感领域做过图像分割&#xff0c;无论是用U-Net、DeepLab还是其他什么模型&#xff0c;大概率都经历过这样的流程&#xff1a;收集一批特定区域的卫星或航拍图像&#xff…

作者头像 李华
网站建设 2026/6/22 1:05:11

BM1684X边缘部署Qwen3-Chat实战:国产ASIC大模型推理方案

1. 项目概述&#xff1a;为什么要在BM1684X算力盒子上跑Qwen3-chat&#xff1f;你手头有一台标着“BM1684X”的黑色小盒子&#xff0c;它不是普通工控机&#xff0c;也不是NAS&#xff0c;而是寒武纪专为边缘AI推理设计的国产ASIC加速卡载体——典型配置是4核ARM A72 CPU 16TO…

作者头像 李华
网站建设 2026/6/22 1:01:39

Druid监控未授权访问漏洞解析与安全加固实战指南

1. 项目概述&#xff1a;从一次内部安全演练说起上个月&#xff0c;我们团队进行了一次常规的内部安全渗透测试。在扫描一个刚上线的Java Web应用时&#xff0c;一个熟悉的路径/druid/index.html赫然出现在扫描器的报告里&#xff0c;并且状态码是200。我心里“咯噔”一下&…

作者头像 李华
网站建设 2026/6/22 1:01:18

免费升级老旧Mac的终极指南:让2008-2017款设备焕发新生

免费升级老旧Mac的终极指南&#xff1a;让2008-2017款设备焕发新生 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为苹果官方停止支持的老旧Mac而烦恼吗…

作者头像 李华
网站建设 2026/6/22 0:56:31

CMTM跨模态令牌调制:无监督视频对象分割的动态特征融合新范式

1. 从“看”到“理解”&#xff1a;视频对象分割的挑战与CMTM的破局思路在计算机视觉领域&#xff0c;让机器像人一样“看懂”视频&#xff0c;并从中分离出我们感兴趣的运动主体&#xff0c;一直是个既基础又充满挑战的任务。这就是视频对象分割&#xff08;Video Object Segm…

作者头像 李华
网站建设 2026/6/22 0:54:56

停止GEO优化后流量会立刻消失吗

这和SEM广告“停投即停流”的逻辑截然不同&#xff0c;也是很多企业判断GEO长期价值时的核心关切。如果停止投入&#xff0c;之前的努力会不会全部清零&#xff1f;GEO的“余量效应”——停了不会立刻归零SEM广告停止投放的瞬间&#xff0c;品牌在广告位上的所有曝光立即消失&a…

作者头像 李华