Linux 服务器磁盘满了?教你快速找到大文件,安全删掉不踩坑!

1. 磁盘空间检查基础命令

1.1 查看磁盘使用情况

bash 复制代码
# 查看所有挂载点的磁盘使用情况
df -h


# 查看指定目录的磁盘使用情况
df -h /home

1.2 查找大文件和目录

bash 复制代码
# 查找当前目录下大于100MB的文件
find . -type f -size +100M -exec ls -lh {} \;


# 查找根目录下大于1GB的文件
find / -type f -size +1G -exec ls -lh {} \;

2. 高级大文件查找方法

2.1 使用du命令

bash 复制代码
# 查看当前目录下最大的10个目录
du -sh * | sort -rh | head -10


# 查看根目录下最大的10个目录
du -sh /* | sort -rh | head -10


# 查看特定目录下的大文件
du -ah /var/log | sort -rh | head -20

2.2 综合查找脚本

bash 复制代码
#!/bin/bash
# 查找系统中最大的文件和目录
echo "=== 最大的10个目录 ==="
du -h / 2>/dev/null | sort -hr | head -10


echo -e "\n=== 最大的10个文件 ==="
find / -type f -size +100M 2>/dev/null | xargs ls -lh | sort -k5 -hr | head -10

3. 常见大文件类型分析

3.1 日志文件清理

bash 复制代码
# 查看日志目录大小
du -sh /var/log/*


# 清理旧的日志文件(保留最近7天)
find /var/log -name "*.log" -mtime +7 -delete


# 压缩旧日志文件
find /var/log -name "*.log" -mtime +3 -exec gzip {} \;

3.2 缓存文件清理

bash 复制代码
# 查看缓存目录大小
du -sh /tmp /var/tmp /var/cache/*


# 清理临时文件
rm -rf /tmp/*
rm -rf /var/tmp/*


# 清理包管理器缓存
yum clean all    # CentOS/RHEL
apt-get clean    # Ubuntu/Debian

4. 实用清理脚本

4.1 自动化清理脚本

bash 复制代码
#!/bin/bash
# disk_cleanup.sh - 自动清理大文件脚本


LOG_FILE="/var/log/disk_cleanup.log"


# 记录日志函数
log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
}


# 检查磁盘使用率
check_disk_usage() {
    local usage=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
    if [ $usage -gt 80 ]; then
        log_message "警告:磁盘使用率过高: ${usage}%"
        return 1
    fi
    return 0
}


# 清理日志文件
cleanup_logs() {
    log_message "开始清理日志文件..."
    
    # 删除超过30天的日志
    find /var/log -name "*.log" -mtime +30 -delete
    
    # 压缩旧日志
    find /var/log -name "*.log" -mtime +7 -exec gzip {} \;
    
    log_message "日志清理完成"
}


# 清理临时文件
cleanup_temp() {
    log_message "开始清理临时文件..."
    
    # 清理过期的临时文件
    find /tmp -type f -mtime +1 -delete
    find /var/tmp -type f -mtime +1 -delete
    
    log_message "临时文件清理完成"
}


# 主执行流程
main() {
    log_message "=== 开始磁盘清理任务 ==="
    
    if check_disk_usage; then
        cleanup_logs
        cleanup_temp
        log_message "=== 磁盘清理任务完成 ==="
    else
        log_message "磁盘使用率过高,跳过清理操作"
    fi
}


main

4.2 定时清理任务

bash 复制代码
# 添加到crontab中定期执行
# 每周日凌晨2点执行清理
0 2 * * 0 /path/to/disk_cleanup.sh


# 每天凌晨3点检查磁盘使用情况
0 3 * * * df -h | grep -E "(Filesystem|/)" > /tmp/disk_usage.txt

5. 安全清理注意事项

5.1 清理前检查

bash 复制代码
# 查看文件详细信息,避免误删重要文件
ls -la /var/log/
ls -la /tmp/


# 查看文件权限和所有者
ls -l /var/log/messages

5.2 验证清理操作

bash 复制代码
# 使用dry-run模式预览将要删除的文件
find /var/log -name "*.log" -mtime +7 -print


# 先备份再删除
cp /var/log/syslog /var/log/syslog.backup
rm /var/log/syslog

6. 监控和预警

6.1 磁盘监控脚本

bash 复制代码
#!/bin/bash
# disk_monitor.sh - 磁盘监控脚本


THRESHOLD=80
EMAIL="admin@example.com"


# 检查磁盘使用率
check_disks() {
    df -h | grep -vE '^Filesystem|tmpfs|cdrom' | while read line; do
        usage=$(echo $line | awk '{print $5}' | sed 's/%//')
        partition=$(echo $line | awk '{print $1}')
        mount_point=$(echo $line | awk '{print $6}')
        
        if [ $usage -gt $THRESHOLD ]; then
            echo "警告:$mount_point 磁盘使用率 $usage%"
            # 发送邮件通知
            echo "磁盘使用率过高,请及时处理" | mail -s "磁盘警告" $EMAIL
        fi
    done
}


check_disks

6.2 创建监控服务

bash 复制代码
# 创建systemd服务用于定时监控
cat > /etc/systemd/system/disk-monitor.service << EOF
[Unit]
Description=Disk Usage Monitor
After=network.target


[Service]
Type=oneshot
ExecStart=/usr/local/bin/disk_monitor.sh
User=root


[Install]
WantedBy=multi-user.target
EOF


# 启用服务
systemctl enable disk-monitor.service

7. 常见问题解决

7.1 已删除但仍在使用的文件

bash 复制代码
# 查找已删除但仍被进程占用的文件
lsof +L1


# 重启相关服务释放文件
systemctl restart nginx
systemctl restart httpd

7.2 大文件恢复

bash 复制代码
# 如果误删了重要文件,可以尝试使用以下方法:
# 1. 使用testdisk或photorec恢复
# 2. 检查是否有备份
# 3. 检查文件系统日志
journalctl -f

8. 最佳实践建议

  1. 定期监控:设置定期的磁盘使用情况检查
  2. 备份重要数据:清理前确保重要数据已备份
  3. 分步清理:先小范围测试,再大规模执行
  4. 记录操作:详细记录清理过程和结果
  5. 设置阈值:建立合理的磁盘使用率预警机制

通过以上方法,可以有效地管理和维护Linux服务器的磁盘空间,确保系统稳定运行。

相关推荐
用户69371750013843 小时前
Google 正在“收紧侧加载”:陌生 APK 安装或需等待 24 小时
android·前端
蓝帆傲亦3 小时前
Web 前端搜索文字高亮实现方法汇总
前端
用户69371750013843 小时前
Room 3.0:这次不是升级,是重来
android·前端·google
漫随流水5 小时前
旅游推荐系统(view.py)
前端·数据库·python·旅游
如意.7595 小时前
【Linux开发工具实战】Git、GDB与CGDB从入门到精通
linux·运维·git
Thera7775 小时前
C++ 高性能时间轮定时器:从单例设计到 Linux timerfd 深度优化
linux·开发语言·c++
踩着两条虫6 小时前
VTJ.PRO 核心架构全公开!从设计稿到代码,揭秘AI智能体如何“听懂人话”
前端·vue.js·ai编程
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ6 小时前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
jzlhll1237 小时前
kotlin Flow first() last()总结
开发语言·前端·kotlin
蓝冰凌8 小时前
Vue 3 中 defineExpose 的行为【defineExpose暴露ref变量】详解:自动解包、响应性与实际使用
前端·javascript·vue.js