2012-07-23 127 views
1

我有一个动作队列,我使用ssh将不同的作业提交到不同的服务器。例如Python:重新设置或守护进程

ssh s1 job1.py 
ssh s2 job2.py 

问题是job1.pyjob2.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

我最终这样做了:subprocess.Popen(['nohup','my_actual_job.py']),同时发送stderr和stdout到/ dev/null。

1

您与Popen问题是job1.py将终止,而无需等待my_actual_job.py完成(假设你从来没有打电话p.join()或类似);然后在被杀之前几乎不会开始。

您是否试过要求ssh进程使用例如ssh -n s1 job1.py

+0

我无法控制ssh ...我检查:http://code.activestate.com/recipes/66012-fork-a-daemon-process-on-unix/...但这不起作用或 – Amir 2012-07-24 19:53:53

1

对于这样的问题,我推荐Celery。它得到的最新版本(3.0)真的很棒,与eventlet支持,帆布等

如果芹菜是太多的开销,比eventlet是在复杂性方面比双绞线更好的解决方案添加到项目(如this