1

我有一个动作队列,我在其中使用 ssh 将不同的作业远程提交到不同的服务器。例如

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 中以某种方式进行。我做了双叉,但仍然不起作用......

4

4 回答 4

1

你的问题Popen是它job1.py会在不等待my_actual_job.py完成的情况下终止(假设你从不打电话p.join()或类似情况);my_actual.job.py然后应该在被杀死之前几乎不能开始。

您是否尝试过ssh使用 eg 要求进程将自身置于后台ssh -n s1 job1.py

于 2012-07-23T23:59:24.047 回答
1

我会推荐Celery来解决这样的问题。它在最新版本(3.0)中变得非常棒,支持 eventlet、canvas 等。

如果 Celery 的开销太大,那么就增加项目的复杂性而言, eventlet是比 Twisted 更好的解决方案(像这样

于 2012-07-24T09:58:22.710 回答
0
  1. 您可以在后台在服务器上运行您的命令,方式不是很明显,但是当您知道方式时很容易使用。 让 ssh 在目标机器的后台执行命令

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

于 2012-07-24T00:21:01.313 回答
0

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

于 2012-08-15T21:48:58.423 回答