2012-03-21 10 views
1

私は独立したプロセスをPythonで作成しようとしています。これらのプロセスは私が複数のインスタンスを持っていて、異なる引数でインスタンス化したいPythonスクリプトです。 は、単にからループのため、私はsubprocess.Popen()を呼び出していますが、引数で相応に変化:複数のpythonプロセス/同じ名前のデーモン(異なるargs)を生成する

subscriber.pyで
for d in mylist: 
    subprocess.Popen(['./subscriber.py', d.arg1, a.arg2, d.arg3]) 

、私は、コードを持っている「daemonizes」あるいは各種recipes あたりのようなプロセスこれに、私はまたして私のsubscriber.pyを起動しようとしている:

for d in mylist: 
    p = multiprocessing.Process(target=subscriber.start, 
           args=(d.arg1, d.arg2, d.arg3)) 
    p.daemon=True 
    p.start() 

私のスクリプトは、共通ログファイルへの書き込みをPythonのログを使用しています。

どちらの方法でも、ループの最後の反復からのプロセスだけが実際に実行されていることになります。私が必要とするのは、これらのバックグラウンドデーモンに「永遠に」実行させることですが、1つしかインスタンスを取得できません! [編集]重要なのは、呼び出しスレッドを終了させて​​、実行中のデーモンを残しておきたいのです。

私はこれまでと同様にstackoverflowや他の場所でgoogledしています。おそらく私のpythonの初心者 - ness ..私のアプローチは完全に間違っていますか?

環境: - Pythonの-2.7、UbuntuのLinuxの

+0

変数を再割り当てする代わりにプロセスのリストを作成しようとしましたか?例えば。 – Serdalis

+0

しかし、私は呼び出し側のスレッドを終了させ、たくさんの実行中のデーモンを残しておきたいと思います(p.append(target = subscriber.start、args =(d.arg1、d.arg2、d.arg3)))後ろに。これは、マルチプロセッシングが子プロセスの実行を許可していないように見えるため、私がPopen()に傾いている理由です。 – lusito75

答えて

0

nohup "daemonizes" anyコマンドと&がバックグラウンドにプッシュします。つまり、そのコマンドを生成したセッションが終了すると、nohup-edコマンドはinitプロセスの子になり(PID = 1)、実行を継続します。

+0

は同じように動作するようです。 > nohup subscriber.py xyz&、nohup subscriber.py abc&の順にコマンドラインから手動でsubscriber.pyを起動しようとすると、psコマンドはsubscriber.pyを実行しているインスタンスを1つだけ表示します(abcバージョン)! – lusito75

+0

存在する可能性のあるインスタンスの数をsubscriber.pyが制御するということですか?また、 '&'が実行されると、生成されたプロセス 'pid(例えば 'nohup sleep 3&... [1] 31080')を表示し、終了時にメッセージを表示します。g。 '[1] + 31080 done nohup sleep 3')。あなたは 'x y z'インスタンスがすぐに死ぬと言っています。つまり、[] + done ...というメッセージが表示されるはずです。 – slavos

0

2のもの(前述されたリストにプロセスを追加するほか):真

  1. 設定デーモン=が実際に何の反対を意味し、期待する。マニュアルから:When a process exits, it attempts to terminate all of its daemonic child processes.。うん!また、デアモンは子供を育てることができません。私をもたらします

: 2.あなたがデーモン= Falseのを持っている子供を起動さ行う必要があり、それらのそれぞれは、起動時に、フォークを使用してデーモン化します()。以下のようなので:mylist.txtは別の行に各subscriber.pyインスタンスの引数を含む

while read ARGS; do 
    nohup ./subscriber.py $ARGS & 
done < mylist.txt 

:あなたは本当にPythonの専用ソリューションを必要としない場合は、小さなシェルスクリプトは、仕事をすることがあり

def daemonize(): 

     pid = os.fork() 
     if pid != 0: 
      sys.exit(0) 


     return pid 
関連する問題