Linux服务器 lsof | grep delete 命令解释
命令作用
lsof
(List Open Files)会列出系统中所有被进程打开的文件。grep delete
用于过滤结果,仅显示已被标记为“已删除”但仍在被进程占用的文件。
使用场景
当文件被删除(如通过 rm
命令),但仍有进程在占用它时,文件实际仍占用磁盘空间(df
显示空间未释放,但 ls
看不到文件)。此命令可定位这类“幽灵文件”。
输出示例
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 1234 alice 1w REG 8,1 100MB 123456 /tmp/log.txt (deleted) nginx 5678 root 3u REG 0,5 200MB 789012 /var/log/nginx/error.log (deleted)
PID:占用文件的进程 ID。
COMMAND:进程名称。
USER:运行进程的用户。
FD:文件描述符(如
1w
表示标准输出写入)。NAME:文件路径,末尾的
(deleted)
表示文件已被删除但未释放。
如何解决问题?
释放空间:
重启进程:例如
systemctl restart nginx
(根据进程名操作)。终止进程:
kill -9 PID
(替换PID
为实际进程号)。清空文件:如果进程允许,可重定向文件描述符(如
echo "" > /proc/PID/fd/FD
)。预防措施:
删除文件前,确保没有进程在写入或读取它。
对日志类文件,使用日志轮转工具(如
logrotate
),避免直接rm
。
常见案例
日志文件:服务(如 Nginx、Java)持续写入日志文件后,若直接
rm
删除,空间不会释放。临时文件:程序运行时创建的临时文件被误删,但进程仍在占用。