You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EC2终止时Jenkins自动备份压缩包过小问题求助

问题排查与解决方案

核心问题分析

你的备份脚本手动执行正常,但systemd关机触发时生成的备份包过小,大概率是以下几个原因导致:

  1. Jenkins未完全停止:脚本执行systemctl stop jenkins后立即打包,此时Jenkins进程可能还在清理或写入数据,导致部分文件未同步到EFS或被锁定无法读取
  2. 网络提前中断:关机流程中网络服务可能在备份上传完成前就被终止,导致tar包未写完或上传中断
  3. systemd执行环境异常:默认工作目录、环境变量缺失,导致tar或aws命令执行异常,只打包了部分文件
  4. 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

排查验证步骤

  1. 查看服务执行日志:journalctl -u shutdown.service -e,检查是否有错误提示
  2. 查看备份脚本日志:cat /var/log/jenkins-backup.log,确认打包、上传流程是否完整
  3. 测试模拟关机触发:systemctl stop shutdown.service,手动触发备份流程验证结果

内容的提问来源于stack exchange,提问作者user2501705

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 08:45:59