我有一个动作队列,我使用ssh远程向不同的服务器提交不同的作业。 e.g。
ssh s1 job1.py
ssh s2 job2.py
问题是job1.py
,job2.py
可能需要很长时间才能完成,我不希望我的动作队列阻止。我想知道我怎么能以某种方式重新找回自己的工作。
我目前的解决方案是:job1.py
使用subprocess.Popen(['my_actual_job.py'])
。使用它,ssh不会阻塞,但my_actual_job.py
永远不会完成。它在完成任务之前就会以某种方式终止。如果我执行ssh s1 "job1.py 2>1"
,my_actual_job.py
完成,但它会阻止我的操作队列。
任何人都知道如何以某种方式重新显示我的子进程(my_actual_job.py
),以便ssh可以终止,但我的工作可以在后台完成任务?
我看到了PEP 3143: Standard daemon process library,但有没有更好更清洁的方法呢?
我无法更改我的ssh命令......我需要以某种方式在我的job1.py中执行此操作。我做了Double Forking,但仍然无法正常工作......
答案 0 :(得分:1)
Popen
的问题在于job1.py
将在不等待my_actual_job.py
完成的情况下终止(假设您从未致电p.join()
或类似情况); my_actual.job.py
然后在被杀之前几乎不能开始。
您是否尝试过要求ssh
进程自我背景,例如ssh -n s1 job1.py
?
答案 1 :(得分:1)
对于像这样的问题,我建议Celery。它在最新版本(3.0)中非常出色,支持eventlet,canvas等。
答案 2 :(得分:0)
您可以在后台运行服务器上的命令,方式不是很明显但是当您知道方式时它很容易使用。 Getting ssh to execute a command in the background on target machine
您可以运行简单的Web服务器来管理每台计算机上的作业。使用Twisted,你应该能够用很少的代码实现这一目标。
答案 3 :(得分:0)
我最终做了:subprocess.Popen(['nohup','my_actual_job.py'])并将stderr和stdout发送到/ dev / null。