lsof命令可排查进程异常占用文件问题:一、用lsof -p PID查指定进程打开的文件;二、用lsof 文件路径或lsof +D 目录查占用文件的进程;三、用lsof -u 用户名按用户查看;四、用lsof -i :端口查端口占用;五、用lsof +L1查已删除但仍被占用的文件。

如果您在Linux系统中需要排查进程异常占用文件或无法删除文件等问题,则可能是由于某个进程正在使用该文件。以下是使用lsof命令查看进程打开文件的多种方法:
一、查看指定进程打开的所有文件
通过进程ID(PID)可精确列出该进程当前打开的全部文件、套接字、管道等资源,便于定位具体被占用的文件路径。
1、使用ps或pidof命令获取目标进程的PID,例如:pidof nginx 或 ps aux | grep sshd。
2、执行lsof命令并指定PID:lsof -p 1234(将1234替换为实际PID)。
3、观察输出中的COMMAND、PID、TYPE、DEVICE、SIZE/OFF、NODE和NAME列,重点关注NAME列显示的完整文件路径。
二、查看指定文件或目录被哪些进程打开
当某个文件无法卸载、删除或修改时,可通过此方法快速识别正在访问该文件的进程,从而终止或调整对应进程行为。
1、确认目标文件的绝对路径,例如:/var/log/syslog。
2、运行命令:lsof /var/log/syslog。
3、若需检查整个目录及其子目录下的所有打开文件,添加+D参数:lsof +D /tmp(注意:该操作可能较慢且需足够权限)。
三、按用户列出所有打开的文件
用于审计特定用户对系统资源的占用情况,或排查因用户会话残留导致的文件句柄未释放问题。
1、确定目标用户名,例如:john。
2、执行命令:lsof -u john。
3、如需排除某类用户(如系统用户),可结合grep过滤:lsof -u ^root | grep -v "DEL"(^表示排除,DEL表示已删除但仍被打开的文件)。
四、查看监听网络端口的进程及对应文件描述符
在排查端口冲突、服务启动失败或连接异常时,该方法可直观显示哪个进程占用了指定端口及关联的socket文件。
1、查看所有监听TCP端口的进程:lsof -iTCP -sTCP:LISTEN。
2、定位特定端口(如8080)的持有者:lsof -i :8080。
3、若需同时显示进程的完整路径,添加-a和-P参数:lsof -a -i :22 -P -n(-P禁用端口名解析,-n禁用主机名解析,提升响应速度)。
五、查找已删除但仍被进程占用的文件
这类文件虽在文件系统中不可见,但仍在内存中被进程引用,持续占用磁盘空间,是常见磁盘满故障的原因之一。
1、运行命令筛选出状态为“deleted”的条目:lsof +L1。
2、从输出中识别NAME列末尾标注为 (deleted) 的行。
3、记录对应PID,并检查其所属进程:ps -p 5678 -o pid,ppid,cmd(将5678替换为实际PID)。









