我是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
谢谢!
答案 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
。