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

Airflow长DAG名称截断导致Make批量暂停命令失败求助

解决Airflow DAG长名称在Make命令中被截断的问题

我编写了一条Make命令用于暂停所有Airflow DAG,当前脚本如下:

for dag in $(shell docker exec -it airflow-webserver-1 airflow dags list | awk '/False/ {print}' | tr -s ' ' | cut -d ' ' -f 1); do \
    docker exec -it airflow-webserver-1 airflow dags pause $$dag; \
done

该脚本对短名称DAG可正常执行,但当DAG名称长度超过22字符时,会被截断为22字符,导致airflow dags pause因找不到对应DAG失败,用grep 'False'处理结果一致。

问题示例

airflow dags list的原始返回条目:

dag-exa-mple-lon-gnames        | dag.py        | dag-owner                  | False 

经awk或grep处理后变为:

dag-exa-mple-lon-gname        | dag.py        | dag-owner                  | False 

可见名称最后一位s(第23位)被截断。

格式错乱原因分析

按建议执行| cat -vet后发现,截断的字符被移至单独行,输出格式混乱。其中^M$里的^M是Windows风格的回车符(CR),$是Unix风格的换行符(LF),两种换行符混合导致表格输出时,过长的DAG名称被强制拆分为多行,后续处理工具将拆分后的行视为独立条目,从而截断了完整名称。

解决方案

方案1:使用CSV格式输出(推荐)

Airflow的dags list命令支持--output csv参数,输出结构化的CSV格式,避免表格换行导致的解析问题,脚本修改如下:

for dag in $(shell docker exec airflow-webserver-1 airflow dags list --output csv | awk -F ',' '$4 == "False" {print $1}'); do \
    docker exec airflow-webserver-1 airflow dags pause $$dag; \
done

注意:移除-it参数,因为Make命令运行在非交互式环境,不需要分配伪终端。

方案2:清理混合换行符并合并拆分行

如果无法使用CSV格式,可以先清理Windows回车符,再将被拆分的DAG名称行合并,脚本如下:

for dag in $(shell docker exec airflow-webserver-1 airflow dags list | tr -d '\r' | awk '
    /^[[:space:]]/ { 
        prev = prev $1; 
        next 
    } 
    prev != "" { 
        print prev; 
        prev = "" 
    } 
    { prev = $0 } 
    END { print prev }
' | awk '/False/ {print $1}'); do \
    docker exec airflow-webserver-1 airflow dags pause $$dag; \
done

该脚本先移除所有\r字符,再将以空格开头的行(拆分的名称部分)合并到上一行,最后提取未启用的DAG名称。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:26:05