Python 如何使用airflows ssh_操作符执行nohup命令?

Python 如何使用airflows ssh_操作符执行nohup命令?,python,airflow,airflow-scheduler,Python,Airflow,Airflow Scheduler,我是airflow的新手,正在尝试使用airflow的ssh_操作符在ec2实例上运行作业,如下所示: t2 = SSHOperator( ssh_conn_id='ec2_ssh_connection', task_id='execute_script', command="nohup python test.py &", retries=3, dag=dag) 这项工作需要几个小时,我希望执行python脚本并结束。但是,当执行命令且dag完

我是airflow的新手,正在尝试使用airflow的ssh_操作符在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

谢谢

Airflow的
SSHHook
使用Paramiko模块进行SSH连接。有关于Prarmiko和nohup的问题。其中一个答案建议在
nohup
命令之后添加
sleep
。我无法确切解释原因,但它确实有效。还需要在
SSHOperator
中设置
get_pty=True

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

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

SSHOperator向日志中写入了什么?我原以为它会写入nohup.out,但后来我添加了以下命令来捕获日志:nohup python test.py>test.log&我是指。您也可以在中访问它:单击操作符,然后查看日志)。我没有收到任何错误。它只是处理它,但是在ec2上使用多处理的python脚本在[Errno 32]管道断开的情况下出错,就像SSHOperator关闭连接时,它导致了该错误。我以为诺胡普会解决这个问题。如果我从ec2手动运行同一个脚本,它不会出错。我相信是
nohup
&
,而不是两个汉克斯在尝试它。ec2上的脚本使用LokyBackend。到目前为止,添加time和get_pty=True允许所有LokyBackend后端完成在时间延迟期间执行的操作,但一旦计时器超过python脚本中的剩余行,就会出错。也许我做错了什么。修改它。@codeBarer我看你接受了答案。你能解决LokyBackend问题吗?有什么问题吗?嗨,我有。加上时间延迟和睡眠,LockyBackend就做到了。但它只适用于在该时间间隔内执行的模块/函数,因此超时后它们会继续运行。至于后面的模块,其他线程没有执行。因此,我正在考虑在EC2上创建一个守护进程,并使用airflow更新环境变量以避免任何问题。