EC2终止时Jenkins自动备份压缩包过小问题求助
问题排查与解决方案
核心问题分析
你的备份脚本手动执行正常,但systemd关机触发时生成的备份包过小,大概率是以下几个原因导致:
- Jenkins未完全停止:脚本执行
systemctl stop jenkins后立即打包,此时Jenkins进程可能还在清理或写入数据,导致部分文件未同步到EFS或被锁定无法读取 - 网络提前中断:关机流程中网络服务可能在备份上传完成前就被终止,导致tar包未写完或上传中断
- systemd执行环境异常:默认工作目录、环境变量缺失,导致tar或aws命令执行异常,只打包了部分文件
- EFS挂载提前卸载:关机时系统优先卸载挂载卷,导致tar无法读取完整的Jenkins目录
解决方案
1. 优化备份脚本(/etc/backup_backend.sh)
添加等待Jenkins停止、日志记录、绝对路径执行、时间戳备份等逻辑:
#!/bin/bash # 定义固定路径与日志文件 LOG_FILE="/var/log/jenkins-backup.log" BACKUP_FILE="/tmp/jenkins-backup-$(date +%Y%m%d%H%M%S).tar.gz" S3_BUCKET="s3://XXX-jenkins-backup/jenkins-backup-$(date +%Y%m%d%H%M%S).tar.gz" # 初始化日志 > $LOG_FILE echo "$(date): 启动Jenkins备份流程" >> $LOG_FILE # 停止Jenkins并等待完全退出 echo "$(date): 停止Jenkins服务" >> $LOG_FILE systemctl stop jenkins WAIT_SEC=0 while systemctl is-active --quiet jenkins; do sleep 5 WAIT_SEC=$((WAIT_SEC+5)) if [ $WAIT_SEC -ge 300 ]; then echo "$(date): Jenkins停止超时,强制继续备份" >> $LOG_FILE break fi done # 同步EFS数据到磁盘 echo "$(date): 同步EFS数据到本地缓存" >> $LOG_FILE sync # 执行打包(使用绝对路径避免环境变量问题) echo "$(date): 开始打包Jenkins目录" >> $LOG_FILE /usr/bin/tar -czvf $BACKUP_FILE /var/lib/jenkins >> $LOG_FILE 2>&1 # 验证打包结果并上传S3 if [ -f $BACKUP_FILE ]; then BACKUP_SIZE=$(du -h $BACKUP_FILE | awk '{print $1}') echo "$(date): 备份包生成成功,大小:$BACKUP_SIZE" >> $LOG_FILE echo "$(date): 开始上传至S3" >> $LOG_FILE /usr/local/bin/aws s3 cp $BACKUP_FILE $S3_BUCKET >> $LOG_FILE 2>&1 if [ $? -eq 0 ]; then echo "$(date): S3上传成功" >> $LOG_FILE rm -f $BACKUP_FILE else echo "$(date): S3上传失败" >> $LOG_FILE fi else echo "$(date): 备份包生成失败" >> $LOG_FILE fi
2. 修正systemd服务配置(/usr/lib/systemd/system/shutdown.service)
调整依赖顺序、超时时间与执行环境,确保备份在网络和挂载卷卸载前完成:
[Unit] Description=Jenkins关机备份服务 # 确保备份在网络、关机流程前执行 Before=network.target shutdown.target reboot.target halt.target # 依赖网络在线状态 Requires=network-online.target After=network-online.target [Service] Type=oneshot ExecStart=/bin/true ExecStop=/etc/backup_backend.sh # 禁止杀死备份进程,确保执行完成 KillMode=none # 服务启动后保持活跃,触发关机时执行Stop动作 RemainAfterExit=yes # 停止超时设置为15分钟,覆盖默认值 TimeoutStopSec=900 # 以root用户执行,避免权限问题 User=root # 指定工作目录为/tmp,防止临时文件权限异常 WorkingDirectory=/tmp # 输出日志到系统journal,方便排查 StandardOutput=journal+console StandardError=journal+console [Install] WantedBy=multi-user.target
3. 更新Terraform初始化脚本
添加daemon-reload确保systemd加载新配置:
sudo cp /tmp/shutdown.service /usr/lib/systemd/system/shutdown.service sudo chmod 644 /usr/lib/systemd/system/shutdown.service sudo systemctl daemon-reload sudo systemctl enable --now shutdown.service
排查验证步骤
- 查看服务执行日志:
journalctl -u shutdown.service -e,检查是否有错误提示 - 查看备份脚本日志:
cat /var/log/jenkins-backup.log,确认打包、上传流程是否完整 - 测试模拟关机触发:
systemctl stop shutdown.service,手动触发备份流程验证结果
内容的提问来源于stack exchange,提问作者user2501705
相关产品推荐
相关产品推荐

