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
相关产品推荐
相关产品推荐

