如何为不同名称的Agent实例分别设置不同日历日期的延迟停止规则
实现不同Name的Agent按指定日期延迟停止的方案
以下为通用实现逻辑和常见场景的可落地代码示例:
核心实现逻辑
- 首先建立Name参数值-停止触发日期的映射关系,可存储在配置文件、环境变量或调度系统参数组中,避免硬编码方便后续调整
- 给Agent新增启动时的日期校验逻辑:Agent启动后先读取自身的Name参数,匹配映射表得到对应的停止日期
- 计算当前系统日期和目标停止日期的时间差,调用系统定时任务/框架自带的延迟执行接口,触发停止操作
- 增加容错校验:如果匹配不到对应Name的停止日期、目标日期早于当前日期,可配置默认停止规则或者抛出告警日志
常见场景实现示例
场景1:Jenkins Agent(Linux环境)
直接在Agent启动脚本中加入以下逻辑即可:
# 配置Name和对应停止日期的映射,可根据实际需求修改 declare -A STOP_DATE_MAP=( ["agent-name-1"]="2024-12-31" ["agent-name-2"]="2024-11-30" ["agent-name-3"]="2024-10-31" ) # 获取当前Agent的Name,可根据你实际的参数获取方式调整 AGENT_NAME=$(cat /etc/jenkins/agent_name) # 匹配停止日期 TARGET_STOP_DATE=${STOP_DATE_MAP[$AGENT_NAME]} if [ -z "$TARGET_STOP_DATE" ]; then echo "未找到对应Agent的停止日期配置,使用默认30天后停止" TARGET_STOP_DATE=$(date -d "+30 days" +%Y-%m-%d) fi # 计算延迟秒数 STOP_TIMESTAMP=$(date -d "$TARGET_STOP_DATE 23:59:59" +%s) CURRENT_TIMESTAMP=$(date +%s) DELAY_SEC=$((STOP_TIMESTAMP - CURRENT_TIMESTAMP)) if [ $DELAY_SEC -le 0 ]; then echo "目标停止日期已过,立即停止Agent" systemctl stop jenkins-agent else echo "Agent将在${DELAY_SEC}秒后停止,对应日期${TARGET_STOP_DATE}" # 后台执行延迟停止 (sleep $DELAY_SEC && systemctl stop jenkins-agent) & fi
场景2:自主开发的Python Agent
在Agent的启动入口加入以下逻辑即可:
import time import threading from datetime import datetime, timedelta # 配置映射关系,可根据实际需求修改 stop_date_map = { "agent-name-1": "2024-12-31", "agent-name-2": "2024-11-30", "agent-name-3": "2024-10-31" } # 替换为你实际获取Agent Name的逻辑 agent_name = "agent-name-1" target_stop_date = stop_date_map.get(agent_name) if not target_stop_date: # 自定义默认规则,这里设置为30天后停止 target_stop_date = (datetime.now() + timedelta(days=30)).strftime("%Y-%m-%d") # 计算延迟时间 target_dt = datetime.strptime(f"{target_stop_date} 23:59:59", "%Y-%m-%d %H:%M:%S") delay_sec = (target_dt - datetime.now()).total_seconds() def delay_stop(sec): time.sleep(sec) # 替换为你实际的Agent停止逻辑 exit(0) if delay_sec <= 0: delay_stop(0) else: # 启动异步线程执行延迟停止,不影响Agent主业务运行 threading.Thread(target=delay_stop, args=(delay_sec,), daemon=True).start()
内容的提问来源于stack exchange,提问作者Aqeel Tariq
相关产品推荐
相关产品推荐

