创意预览图

## 6.rm 删了文件,磁盘空间为什么不释放? 线上磁盘告警,你查到 `/data/server/wg/` 下有个 20G 的 `nohup.out`,二话不说 `rm -f nohup.out`,

用户头像

1r44o61adj2...

2026.06.08
## 6.rm 删了文件,磁盘空间为什么不释放? 线上磁盘告警,你查到 `/data/server/wg/` 下有个 20G 的 `nohup.out`,二话不说 `rm -f nohup.out`,但 `df -h` 一看——磁盘使用率纹丝不动。 **问题出在哪?怎么排查?怎么解决?** #### 6.1 根因 Linux 删除文件只是删了**目录的引用(硬链接)**。只要还有**进程持有该文件的文件描述符(fd)**,文件数据就还在磁盘上,内核不会真正回收。 #### 6.2 排查三板斧 ```bash # 1. 看哪个进程还占着文件(文件已被删除但 fd 没关) lsof | grep deleted # 输出示例: java 3428058 3428754 http-nio- worker 2w REG 253,16 1812247564 268667931 /data/server/wg/nohup.out (deleted) # 2. 只看大小超过 100MB 的已删除文件 lsof | grep deleted | awk '{if($7>104857600) print $0}' # 3. 确认进程还在写日志 ls -l /proc/3428058/fd/5 lr-x------ 1 worker worker 64 Jun 8 16:51 /proc/3428058/fd/5 -> /data/server/wg/udp6-api-6.9.1-SNAPSHOT.jar ``` #### 6.3 解决方案(二选一) ```bash # 方案一:重启进程(不优雅,但最常用) ./restart.sh # 方案二:直接清空 fd,空间立即释放,进程不中断(优雅) echo '' > /proc/3428058/fd/5 # 清空 truncate -s 0 /proc/3428058/fd/5 # 或 truncate ``` #### 6.4 日常预防 ```bash # 清日志不要 rm,用重定向(不会产生 deleted 文件) > nohup.out # 或 cat /dev/null > nohup.out ``` **口诀:**rm 删的是路径,进程不放手空间不归还;lsof 查 deleted,truncate 清 fd。 根据上面的内容你可以适当优化下,生成图片## 6.rm 删了文件,磁盘空间为什么不释放?
线上磁盘告警,你查到 `/data/server/wg/` 下有个 20G 的 `nohup.out`,二话不说 `rm -f nohup.out`,但 `df -h` 一看——磁盘使用率纹丝不动。
**问题出在哪?怎么排查?怎么解决?**
#### 6.1 根因
Linux 删除文件只是删了**目录的引用(硬链接)**。只要还有**进程持有该文件的文件描述符(fd)**,文件数据就还在磁盘上,内核不会真正回收。
#### 6.2 排查三板斧
```bash
# 1. 看哪个进程还占着文件(文件已被删除但 fd 没关)
lsof | grep deleted
# 输出示例:
java  3428058 3428754 http-nio- worker    2w      REG             253,16 1812247564  268667931 /data/server/wg/nohup.out (deleted)
# 2. 只看大小超过 100MB 的已删除文件
lsof | grep deleted | awk '{if($7>104857600) print $0}'
# 3. 确认进程还在写日志
ls -l /proc/3428058/fd/5
lr-x------ 1 worker worker 64 Jun  8 16:51 /proc/3428058/fd/5 -> /data/server/wg/udp6-api-6.9.1-SNAPSHOT.jar
```
#### 6.3 解决方案(二选一)
```bash
# 方案一:重启进程(不优雅,但最常用)
./restart.sh
# 方案二:直接清空 fd,空间立即释放,进程不中断(优雅)
echo '' > /proc/3428058/fd/5           # 清空
truncate -s 0 /proc/3428058/fd/5        # 或 truncate
```
#### 6.4 日常预防
```bash
# 清日志不要 rm,用重定向(不会产生 deleted 文件)
> nohup.out
# 或
cat /dev/null > nohup.out
```
**口诀:**rm 删的是路径,进程不放手空间不归还;lsof 查 deleted,truncate 清 fd。
根据上面的内容你可以适当优化下,生成图片