对于长期运行的 CentOS 服务器而言,系统日积月累产生的日志文件、临时文件、软件缓存等会逐渐占用大量磁盘空间,甚至影响系统性能,手动清理不仅繁琐,而且容易遗漏,创建一个自动化、可定制的清理垃圾脚本,是系统管理员一项高效且必要的日常维护工作。

识别主要的垃圾来源
在编写脚本之前,我们首先需要明确 CentOS 系统中常见的“垃圾”文件分布在何处,主要可以分为以下几类:
- 软件包缓存:使用
yum或dnf安装软件后,下载的安装包会保留在/var/cache/yum/或/var/cache/dnf/目录下。 - 系统日志:日志文件位于
/var/log/目录下,如messages,secure,cron等,以及 systemd 的日志,它们会无限制地增长。 - 临时文件:系统和应用程序产生的临时文件存放在
/tmp和/var/tmp目录中。 - 旧内核:系统更新后,旧的内核版本默认不会被删除,占用着
/boot分区的宝贵空间。 - 孤立软件包:曾作为依赖被安装,但现在其主应用已卸载,这些包就成了“孤儿”。
构建清理脚本:分步解析
一个健壮的清理脚本应当具备功能模块化、执行安全的特点,下面我们将逐一构建脚本的各个功能模块。
清理软件包缓存
这是最安全、最直接的清理步骤,Yum/DNF 提供了内置的清理命令。
echo "正在清理 Yum/DNF 缓存..." dnf clean all 2>/dev/null || yum clean all echo "Yum/DNF 缓存清理完毕。"
脚本中同时兼容 dnf (CentOS 8+) 和 yum (CentOS 7),并使用 2>/dev/null 抑制可能出现的错误信息,使输出更干净。
清理系统日志
对于传统的日志文件,我们可以删除超过一定天数的日志,对于 systemd 日志,使用 journalctl 是最佳选择。
echo "正在清理超过 30 天的系统日志..."
find /var/log -type f -name "*.log" -mtime +30 -exec rm -f {} ;
echo "传统日志清理完毕。"
echo "正在限制 systemd 日志大小..."
journalctl --vacuum-size=100M
echo "systemd 日志限制完毕。"
这里,我们删除了30天前修改过的 .log 文件,并将 systemd 日志总大小限制在 100MB。-mtime +30 是一个精准的时间过滤器。

清理旧的内核
保留当前正在使用的内核和上一版本作为备份,删除其余所有旧内核,是释放 /boot 空间的有效手段。
echo "正在清理旧的内核..."
# 安装 yum-utils 工具(如果尚未安装)
if ! command -v package-cleanup &> /dev/null; then
dnf install -y yum-utils || yum install -y yum-utils
fi
# 保留最新的两个内核
package-cleanup --oldkernels --count=2 -y
echo "旧内核清理完毕。"
package-cleanup 是 yum-utils 提供的一个强大工具,--count=2 表示保留两个最新的内核版本。
清理临时文件
/tmp 目录下的文件通常可以安全删除,特别是那些长时间未被访问的。
echo "正在清理超过 7 天的临时文件..." find /tmp -type f -atime +7 -delete find /var/tmp -type f -atime +7 -delete echo "临时文件清理完毕。"
-atime +7 表示删除7天前未被访问过的文件,相比 -mtime(修改时间)在某些场景下更安全。
完整脚本与使用指南
将以上模块整合,并加入一些安全提示和日志输出,就形成了一个完整的清理脚本。
#!/bin/bash
# CentOS 系统垃圾清理脚本
# 建议在执行前备份重要数据
set -e # 遇到错误立即退出
echo "=========== 开始系统垃圾清理 ==========="
# 1. 清理软件包缓存
echo "步骤 1/4: 清理软件包缓存..."
dnf clean all 2>/dev/null || yum clean all
echo "✔ 软件包缓存清理完毕。"
# 2. 清理系统日志
echo "步骤 2/4: 清理系统日志..."
find /var/log -type f -name "*.log" -mtime +30 -exec rm -f {} ;
journalctl --vacuum-size=100M
echo "✔ 系统日志清理完毕。"
# 3. 清理旧的内核
echo "步骤 3/4: 清理旧的内核..."
if ! command -v package-cleanup &> /dev/null; then
dnf install -y yum-utils || yum install -y yum-utils
fi
package-cleanup --oldkernels --count=2 -y
echo "✔ 旧内核清理完毕。"
# 4. 清理临时文件
echo "步骤 4/4: 清理临时文件..."
find /tmp -type f -atime +7 -delete
find /var/tmp -type f -atime +7 -delete
echo "✔ 临时文件清理完毕。"
echo "=========== 垃圾清理任务完成 ==========="
使用方法:

- 将以上代码保存为
cleanup.sh。 - 赋予执行权限:
chmod +x cleanup.sh。 - 以 root 权限执行:
sudo ./cleanup.sh。
为了方便管理,我们可以将上述清理策略归纳为下表:
| 清理目标 | 主要目录/工具 | 核心命令示例 | 清理策略 |
|---|---|---|---|
| 软件包缓存 | /var/cache/yum, /var/cache/dnf |
dnf clean all |
删除所有缓存 |
| 系统日志 | /var/log, journalctl |
find ... -mtime +30, journalctl --vacuum-size=100M |
删除30天前的日志,限制总大小 |
| 旧的内核 | /boot |
package-cleanup --oldkernels --count=2 |
保留最新的2个内核 |
| 临时文件 | /tmp, /var/tmp |
find ... -atime +7 -delete |
删除7天前未访问的文件 |
相关问答FAQs
Q1: 运行这个清理脚本安全吗?我需要注意什么?
A1: 该脚本中的命令都是系统维护中的标准操作,总体上是安全的,但任何自动化删除操作都存在潜在风险,请务必注意以下几点:
- 备份: 在首次在任何生产服务器上运行前,请确保已对重要数据进行备份。
- 测试: 建议先在测试环境中运行脚本,观察其行为和结果是否符合预期。
- 理解命令: 请确保您理解脚本中每一个
rm或find -delete命令的作用,不要盲目运行来源不明的脚本。 - 检查日志文件: 某些应用程序可能对日志文件的路径和保留策略有特殊要求,清理前请确认。
Q2: 我应该多久运行一次这个脚本?可以自动运行吗?
A2: 运行频率取决于服务器的使用情况和磁盘容量。
- 对于生产服务器: 如果服务器日志增长快或磁盘空间紧张,可以设置为每周或每两周运行一次。
- 对于个人或开发环境: 一个月运行一次通常就足够了。
您可以通过cron任务来实现自动化,以 root 用户编辑 crontab:sudo crontab -e,然后添加一行,在每周日凌晨3点自动运行脚本:
0 3 * * 0 /path/to/your/cleanup.sh > /var/log/cleanup.log 2>&1
这样,脚本就会在后台定期执行,并将输出日志重定向到/var/log/cleanup.log文件中以供查验。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!