如何优雅停止Airflow 1.9.0(Python 2.7)中的DAG?
优雅停止Airflow 1.9.0中运行缓慢的DAG
嘿,我在Airflow 1.x版本折腾过不少慢任务的问题,刚好能给你几个实用的办法,分UI和命令行两种场景来,确保既停得快又不搞乱元数据:
第一步:先暂停DAG,阻止新任务触发
首先得先把DAG暂停,不然你这边刚停掉当前任务,调度器可能又触发新的实例,白忙活。在Airflow 1.9的UI里:
- 回到DAG列表页面,找到你那个上传文件的DAG,左边有个圆形的「暂停/启用」开关(或者顶部导航栏里的
Pause DAG按钮),点击切换成暂停状态。这样调度器就不会再给这个DAG分配新的任务了。
第二步:终止正在运行的任务实例
暂停DAG只是阻止新任务,正在跑的那个慢任务还得单独处理,分两种方式:
方式一:通过UI操作(适合快速处理单个任务)
- 进入这个DAG的
Tree View或者Graph View页面,找到那个显示为「运行中」的绿色任务节点。 - 点击这个节点,在弹出的任务详情页面里,你可以选择
Mark as Failed或者Mark as Success——但注意,这只是更新元数据库里的任务状态,如果任务是在Celery Worker上跑的,实际进程可能还在后台运行。所以如果是CeleryExecutor,这种方法只能标记状态,还得配合命令行杀进程。
方式二:命令行操作(更可靠,适合所有Executor类型)
这是我更推荐的方式,能彻底终止任务进程:
如果你用的是CeleryExecutor
- 先查看当前活跃的Celery任务:
输出里会找到对应DAG和任务的ID。celery -A airflow.executors.celery_executor.app inspect active - 用
revoke命令终止任务,加上--terminate参数强制停止:celery -A airflow.executors.celery_executor.app revoke <任务ID> --terminate
如果你用的是Sequential/LocalExecutor
- 先找到对应的Airflow任务进程:
或者直接搜Python进程里的关键词,比如你处理tar文件的脚本名。ps aux | grep "airflow run <你的DAG ID>" - 用
kill命令终止进程,优先用-TERM信号让它优雅清理资源(比如关闭文件句柄),如果没反应再用-9强制杀死:kill -TERM <进程ID> # 要是TERM没效果,再用强制终止 kill -9 <进程ID>
最后:验证是否彻底停止
处理完后,回到UI的任务详情页,确认任务状态变成Failed或Success,同时用ps命令再检查一遍,确保对应的进程已经消失。另外,等你修复完DAG代码后,记得把DAG重新启用。
内容的提问来源于stack exchange,提问作者Greg Dougherty
相关产品推荐
相关产品推荐

