宝塔定时脚本磁盘满自动清理日志文件
宝塔面板磁盘空间被日志占满如何自动清理?
当宝塔面板服务器长时间运行后,Nginx访问日志、错误日志、MySQL慢查询日志以及网站运行时产生的日志会快速积累,导致磁盘空间耗尽,网站无法正常访问。
解决思路是编写一个Shell脚本,保留最近N天的日志,删除过期文件,再通过宝塔面板的定时任务或系统Crontab自动执行。
本文针对零基础用户,提供可直接复制使用的脚本和配置步骤。
哪些日志最占空间?
- Nginx日志:默认位置
/www/wwwlogs/,包含.log文件。 - MySQL日志:通常位于
/www/server/data/,但宝塔默认不开启慢查询日志;如果开启过,文件可能很大。 - 网站运行日志:部分程序(如WordPress、ThinkPHP)会在网站目录下生成
runtime或logs文件夹。 - 系统日志:
/var/log/下的messages、secure等,但一般不会满,可酌情清理。
编写自动清理脚本
在宝塔面板的 /root/ 或 /www/ 下创建脚本文件,例如 clean_logs.sh。
#!/bin/bash
# 保留日志天数(可修改)
RETENTION_DAYS=7
# Nginx日志目录
NGINX_LOG_DIR="/www/wwwlogs"
find "$NGINX_LOG_DIR" -name "*.log" -type f -mtime +$RETENTION_DAYS -exec rm -f {} \;
# 网站运行日志(假设你的网站日志在 /www/wwwroot/your_site/runtime)
# 可通过宝塔网站管理查看具体路径,下面为通用示例:
SITE_LOG_DIR="/www/wwwroot/*/runtime"
find $SITE_LOG_DIR -name "*.log" -type f -mtime +$RETENTION_DAYS -exec rm -f {} \;
# MySQL慢查询日志(如果开启)
MYSQL_LOG="/www/server/data/mysql-slow.log"
if [ -f "$MYSQL_LOG" ]; then
# 清空文件(保留文件本身,避免MySQL写日志异常)
cat /dev/null > "$MYSQL_LOG"
fi
echo "Log cleanup completed on $(date)"
注意:rm -f直接删除文件,如需更保守可用> filename清空内容。首次运行建议先find ... -print查看哪些文件将被删除。
给脚本执行权限:chmod +x /www/clean_logs.sh
配置定时任务(宝塔面板操作)
- 登录宝塔面板后台,点击左侧菜单 计划任务。
- 点击 添加计划任务。
- 任务类型 选择 Shell脚本。
- 任务名称 填写
自动清理日志。 - 执行周期 选择 每天,时间建议凌晨低峰期(如 03:00)。
- 脚本内容 粘贴上面完整的脚本。
- 点击 添加 保存。
如果需要更灵活的时间(比如每周末执行一次),可在宝塔计划任务中选择 Nginx - 日志切割 类似方式,但清理脚本推荐用Shell方式。
使用系统Crontab(可选)
如果你熟悉Linux命令行,也可以直接在SSH中编辑Crontab:
crontab -e
# 添加以下行(每天凌晨3点执行)
0 3 * * * /bin/bash /www/clean_logs.sh >/dev/null 2>&1
保存后,systemctl restart crond 或等待自动生效。
避坑指南
- 不要删除当前正在写入的日志文件:上述脚本使用
-mtime +7只删除 7 天前的文件,当天日志不会被删。但如果日志文件被程序锁定,rm后可能无法释放磁盘空间。更稳妥的做法是使用truncate或cat /dev/null > 文件清空内容。 - MySQL慢查询日志清空:直接
rm再创建新文件可能因权限问题导致MySQL无法写入。使用cat /dev/null > 文件保持 inode 不变。 - 测试运行:初次执行前,先在SSH中运行脚本:
bash /www/clean_logs.sh,观察输出和磁盘变化。 - 日志切割:宝塔面板自带Nginx日志切割功能(计划任务-日志切割),会按天分割日志。如果已启用,清理脚本只需删除更早的切割文件即可。
效果验证
- 执行清理脚本后,执行
df -h查看磁盘使用率是否下降。 - 检查
/www/wwwlogs/目录下日志文件是否只有近几天的。 - 访问网站确认功能正常。
- 查看宝塔计划任务执行日志:在计划任务列表点击“执行日志”,确认Shell脚本运行成功。
常见问题解答
Q1:执行脚本提示“Permission denied”怎么办?
A:脚本没有执行权限。执行 chmod +x /www/clean_logs.sh 再试。
Q2:我想保留30天的日志,如何修改?
A:修改脚本中的 RETENTION_DAYS=30,然后重新添加或编辑计划任务。
Q3:脚本运行后磁盘空间没释放是什么原因?
A:可能因为日志文件正在被进程使用,删除后空间并未释放。重启对应服务(如 nginx -s reopen)或使用 lsof | grep deleted 查找占用进程。或改用清空内容的方式代替删除。
Q4:宝塔面板自带的日志切割和这个清理脚本冲突吗?
A:不冲突。日志切割是将当前日志重命名并新建空文件;清理脚本是删除旧日志。两者配合可以更精细地管理日志生命周期。建议先了解宝塔日志切割的保留周期,再设置清理脚本的保留天数。
如果你使用的是如 泽御云 等正规云服务商提供的服务器,可参考其文档获取磁盘监控与告警配置,结合本文定时清理方案,能有效防止磁盘满导致的服务中断。