1

ssh を使用してリモートでさまざまなサーバーにさまざまなジョブを送信するアクション キューがあります。例えば

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.pyssh は終了できるが、ジョブはバックグラウンドでタスクを終了できるように、どうにかして子プロセス ( ) の親を変更する方法を知っている人はいますか?

PEP 3143: Standard daemon process libraryを見ましたが、それを行うためのより良い、よりクリーンな方法はありますか?

ssh コマンドを変更できません... どうにかして job1.py で変更する必要があります。Double Forkingを実行しましたが、まだ機能しません...

4

4 に答える 4

1

あなたの問題Popenは、job1.py終了するのを待たずに終了するmy_actual_job.pyことです(電話p.join()などをしていないことを前提としています)。my_actual.job.pyその後、殺される前にかろうじて開始する必要があります。

sshたとえば、プロセス自体をバックグラウンドにするように依頼してみましたssh -n s1 job1.pyか?

于 2012-07-23T23:59:24.047 に答える
1

このような問題にはセロリをお勧めします。イベントレット、キャンバスなどのサポートにより、最新版(3.0)で本当に素晴らしいものになりました.

Celeryのオーバーヘッドが大きすぎる場合、プロジェクトに追加される複雑さの点で、イベントレットよりも Twisted よりも優れたソリューションです (このように)

于 2012-07-24T09:58:22.710 に答える
0

最終的には、subprocess.Popen(['nohup','my_actual_job.py']) を実行し、stderr と stdout の両方を /dev/null に送信しました。

于 2012-08-15T21:48:58.423 に答える
0
  1. バックグラウンドでサーバー上でコマンドを実行するだけです。方法はあまり明白ではありませんが、方法を知っていれば簡単に使用できます。 ターゲットマシンでバックグラウンドでコマンドを実行するための ssh の取得

  2. すべてのマシンでジョブを管理する単純な Web サーバーを実行できます。Twistedを使えば、これを少しのコードで実現できるはずです。

于 2012-07-24T00:21:01.313 に答える