2012-07-23 125 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