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

如何在任一会话失败时立即终止并行运行的工作流?

解决方案

一、工作流引擎层面调整

多数主流工作流引擎(如Airflow、Jenkins Pipeline、Apache NiFi)都支持并行任务失败时立即终止所有关联会话的配置——仅勾选“fail parent if this task fails”只会标记父任务失败,但不会主动终止正在运行的并行会话,需要补充以下配置:

  • 核心配置逻辑:启用「失败快速终止」类规则,比如:
    • Airflow:给并行任务组设置trigger_rule=one_failed,同时为每个并行任务添加on_failure_callback,在回调中标记失败状态,再通过父任务调用clear_task_instances终止其他并行任务。
    • Jenkins Pipeline:使用parallel块时添加failFast: true参数,一旦任一分支失败,立即终止所有并行分支。
    • 通用思路:找到工作流引擎中「并行任务失败时终止所有同级任务」的专属开关,替代单纯的「标记父任务失败」选项。

二、Shell脚本层面实现

如果工作流引擎本身难以调整,可通过改造现有Shell脚本实现并行启动+失败立即终止的逻辑:

核心逻辑

  1. 并行启动所有工作流会话,记录每个会话的PID。
  2. 实时监控所有PID的运行状态,一旦发现任一PID退出且返回值非0,立即杀掉其余所有运行中的PID。
  3. 脚本最终以失败状态退出。

示例脚本

#!/bin/bash

# 替换为你的工作流启动命令列表
WORKFLOWS=(
  "./start_workflow.sh session_A"
  "./start_workflow.sh session_B"
  "./start_workflow.sh session_C"
)

# 存储所有工作流进程的PID
RUNNING_PIDS=()

# 并行启动所有工作流
for WF_CMD in "${WORKFLOWS[@]}"; do
  echo "启动会话: $WF_CMD"
  $WF_CMD &
  RUNNING_PIDS+=($!)
done

# 监控进程状态,检测失败
FAILURE_DETECTED=0
while [ $FAILURE_DETECTED -eq 0 ]; do
  for PID in "${RUNNING_PIDS[@]}"; do
    # 检查进程是否存活
    if ! kill -0 "$PID" 2>/dev/null; then
      # 获取进程退出码
      wait "$PID"
      EXIT_CODE=$?
      if [ $EXIT_CODE -ne 0 ]; then
        echo "会话PID $PID 执行失败(退出码: $EXIT_CODE),正在终止所有剩余会话..."
        FAILURE_DETECTED=1
        break
      fi
    fi
  done
  # 降低循环频率,减少CPU占用
  sleep 1
done

# 终止所有仍在运行的工作流
for PID in "${RUNNING_PIDS[@]}"; do
  if kill -0 "$PID" 2>/dev/null; then
    kill "$PID"
    echo "已终止会话PID $PID"
  fi
done

# 标记脚本执行失败
exit 1

脚本说明

  • 将WORKFLOWS数组中的内容替换为你的实际工作流启动命令。
  • kill -0 $PID仅用于检查进程是否存活,不会发送终止信号。
  • 一旦检测到任一会话失败,立即终止所有剩余运行的会话进程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:40:50