Python:重新定义或守护进程

时间:2012-07-23 23:49:22

标签: python process parent-child daemon

我有一个动作队列,我使用ssh远程向不同的服务器提交不同的作业。 e.g。

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,但仍然无法正常工作......

4 个答案:

答案 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等。

如果Celery的开销过高,那么eventlet在添加到项目中的复杂性(如this)方面比Twisted更好解决方案

答案 2 :(得分:0)

  1. 您可以在后台运行服务器上的命令,方式不是很明显但是当您知道方式时它很容易使用。 Getting ssh to execute a command in the background on target machine

  2. 您可以运行简单的Web服务器来管理每台计算机上的作业。使用Twisted,你应该能够用很少的代码实现这一目标。

答案 3 :(得分:0)

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