提交 d52be3a9 authored 作者: PGY's avatar PGY

feat(scripts): 添加检测已删除进程的脚本及更新配置文档

上级 666bc596
#!/bin/bash
echo "==============================================="
echo " Linux 已删除但仍被占用文件排查工具 (内核直读版)"
echo "==============================================="
echo -e "\n🔍 正在扫描被删除但仍被进程占用的文件...\n"
total_size=0
found_count=0
# 遍历所有进程的 fd 目录
for fd_path in /proc/[0-9]*/fd/*; do
# 检查是否为符号链接且指向已删除文件
if [ -L "$fd_path" ] && ls -l "$fd_path" 2>/dev/null | grep -q "(deleted)"; then
# 提取 PID 和 FD
pid=$(echo "$fd_path" | cut -d'/' -f3)
fd=$(echo "$fd_path" | cut -d'/' -f5)
# 获取原始文件路径
target_file=$(readlink "$fd_path")
# 获取进程名
if [ -f "/proc/$pid/comm" ]; then
proc_name=$(cat "/proc/$pid/comm")
else
proc_name="unknown"
fi
# 获取文件大小 (通过 stat 命令获取该 fd 对应的大小)
# 注意:对于已删除文件,直接 stat fd 路径是获取该文件大小最准确的方法
size_bytes=$(stat -L -c %s "$fd_path" 2>/dev/null || echo 0)
if [ "$size_bytes" -gt 0 ] || [[ "$target_file" == *"$TARGET_KEY"* ]]; then
found_count=$((found_count + 1))
total_size=$((total_size + size_bytes))
size_mb=$(echo "scale=2; $size_bytes / 1024 / 1024" | bc)
echo "--------------------------------------------------"
printf "进程: %-15s | PID: %-8s | FD: %-5s\n" "$proc_name" "$pid" "$fd"
printf "占用: %-10s MB | 文件: %s\n" "$size_mb" "$target_file"
fi
fi
done
if [ "$found_count" -eq 0 ]; then
echo "✅ 未发现被占用的已删除文件,磁盘空间正常。"
else
total_mb=$(echo "scale=2; $total_size / 1024 / 1024" | bc)
total_gb=$(echo "scale=2; $total_size / 1024 / 1024 / 1024" | bc)
echo "=================================================="
printf "总共被删除但未释放的空间:%.2f MB (%.2f GB)\n" "$total_mb" "$total_gb"
echo "=================================================="
fi
echo -e "\n📌 处理建议:"
echo "1) 重启占用文件的进程即可释放空间(推荐)"
echo "2) 或执行: kill -9 <PID>"
echo "3) 若为日志文件,建议检查日志轮转策略(如 logrotate 是否配置了 copytruncate)"
echo -e "\n🎉 扫描完成。\n"
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论