如何使用气流ssh_operator进行nohup命令?

时间:2020-06-05 20:22:18

标签: python airflow airflow-scheduler

我是airflow的新手,我正尝试使用airflow的ssh_operator在ec2实例上运行作业,如下所示:

t2 = SSHOperator(
    ssh_conn_id='ec2_ssh_connection',
    task_id='execute_script',
    command="nohup python test.py &",
    retries=3,
    dag=dag)

这项工作需要几个小时,我想让气流执行python脚本并结束。但是,当命令执行且dag完成时,脚本将在ec2实例上终止。我还注意到上面的代码没有创建nohup.out文件。

我正在研究如何使用SSHOperator运行nohup。看来这可能是与python相关的问题,因为执行nohup时,我在EC2脚本上收到以下错误:

[Errno 32] Broken pipe

谢谢!

1 个答案:

答案 0 :(得分:1)

Airflow的SSHHook使用Paramiko模块进行SSH连接。有an SO question关于Prarmiko和nohup。答案之一是建议在sleep命令之后添加nohup。我无法确切说明原因,但实际上可以。还必须在get_pty=True中设置SSHOperator

这是一个完整的示例,演示了解决方案:

from datetime import datetime
from airflow import DAG
from airflow.contrib.operators.ssh_operator import SSHOperator


default_args = {
    'start_date': datetime(2001, 2, 3, 4, 0),
}

with DAG(
    'a_dag', schedule_interval=None, default_args=default_args, catchup=False,
) as dag:
    op = SSHOperator(
        task_id='ssh',
        ssh_conn_id='ssh_default',
        command=(
            'nohup python -c "import time;time.sleep(30);print(1)" & sleep 10'
        ),
        get_pty=True,  # This is needed!
    )

nohup.out文件被写入用户的$HOME