项目背景在运维工作中日志管理是基础但重要的一环长期不清理的日志会占满磁盘导致服务崩溃而手动备份又费时费力这次我用 Shell 脚本 Crontab 实现了 Nginx 日志的自动化备份实现目标每天凌晨 2 点自动打包备份 Nginx 日志备份文件名带日期方便区分自动删除 7 天前的旧备份防止占满磁盘记录备份日志方便后续排查脚本内容#!/bin/bash# Nginx 日志自动备份脚本# 定义变量LOG_DIR/var/log/nginxBACKUP_DIR/root/nginx_backupDATE$(date%Y-%m-%d)BACKUP_FILEnginx_log_${DATE}.tar.gz# 创建备份目录如果不存在mkdir-p$BACKUP_DIR# 打包压缩日志tar-czf$BACKUP_DIR/$BACKUP_FILE$LOG_DIR# 检查打包是否成功if[$?-eq0];thenecho$(date%Y-%m-%d %H:%M:%S)Backup success:$BACKUP_FILE/var/log/nginx_backup.logelseecho$(date%Y-%m-%d %H:%M:%S)Backup failed/var/log/nginx_backup.logfi# 删除 7 天前的旧备份find$BACKUP_DIR-namenginx_log_*.tar.gz-mtime7-deleteecho$(date%Y-%m-%d %H:%M:%S)Clean completed/var/log/nginx_backup.log关键点说明$?获取上一条命令的返回值0 表示成功find ... -mtime 7 -delete查找 7 天前的文件并删除日志格式统一为YYYY-MM-DD HH:MM:SS便于后续分析Crontab 配置赋予脚本执行权限chmodx /root/scripts/backup_nginx_log.sh编辑定时任务crontab-e添加以下内容02* * * /bin/bash /root/scripts/backup_nginx_log.sh参数说明0 2 * * *每天凌晨 2 点 0 分执行必须使用绝对路径因为 cron 环境变量极少确认定时任务已添加crontab-l测试验证为了立即验证脚本是否能被 cron 正常调用临时改为每分钟执行一次crontab-e# 改为 * * * * * /bin/bash /root/scripts/backup_nginx_log.sh等待 2~3 分钟后查看日志cat/var/log/nginx_backup.log日志显示每分钟都有新记录说明 cron 调用成功测试通过后改回正式时间0 2 * * *排查技巧查看 cron 执行记录grepCRON /var/log/cron或使用 journalctljournalctl-ucrond--since5 minutes ago总结这个脚本本身不复杂但第一次让脚本自己跑起来、不用我动手感觉还是挺不一样的后面打算再加点东西比如按周归档、备份到远程机器慢慢把它做成一个真正能用的工具