Python 如何使用airflows ssh_操作符执行nohup命令?
我是airflow的新手,正在尝试使用airflow的ssh_操作符在ec2实例上运行作业,如下所示: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完
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更新环境变量以避免任何问题。