2017-04-12 9 views
1

インデックス作成操作を実行するサブプロセスを作成するpythonスクリプトがあります(logstashからelasticsearchへ)。Pythonサブプロセスが完了したときにポストアクションを実行する方法

次のようにコードスニペットは、

process = subprocess.Popen([logstash, '-f', sample.conf], 
            stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

私は、スクリプトの残りの部分とは独立して実行する必要性を作成していますサブプロセスとして、)(process.waitを呼び出すことはありません。

しかし、サブプロセスが完了したらデータベースレコードを更新する必要があります。実行中の索引付け操作では、データベースを更新できるポスト・ジョブ・コールを作成できません。

どうすればこの問題をPythonのサブプロセスで処理できますか?ジョブのPIDをテキストファイルに保存しますが、次のスクリプトを実行するためにサブプロセスが完了したことを知っているトリガーが必要です。

答えて

0

スレッド内でプロセスを作成することができます。あなたが出力を得るようにするには、スレッドからwaitをすることができ、そしてそれは

import threading 
import subprocess 

def run_command(): 
    p = subprocess.Popen([logstash, '-f', sample.conf], 
           stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
    output = p.stdout.read() 
    p.wait() 
    # now your command has ended, do whatever you like 

とあなたのメインスレッドでは、非ブロッキングです:

t = threading.Thread(target=run_command) 
t.start() 
# continue with main processing 
+0

これは私の書き込みアプローチのようです。上記のコードを実行すると、 "TypeError: 'Popen'オブジェクトは反復可能ではありません"というエラーがスローされます。サブプロセス内にサブプロセスを作成するのは許可されていないようです。上記のコードを正常にテストしましたか? – Vinod

+0

申し訳ありませんが、誤字!一定。私はそれをテストしていませんが、それは私が書いたものと非常によく似ています。 –

+0

ありがとう、エラーは消えてしまった。しかし、上記のコードを実行すると、メインスレッドコードが完成すると、サブプロセスが完了するまでスクリプトがターミナルでハングします。サブプロセスを実行してメインスレッドを終了させるにはどうすればいいですか(コマンドラインを再びアクティブにする場合など)? – Vinod

0

あなたはどこかprocess変数を隠しておくように見えるので、後でpollメソッドを呼び出すと、そのreturncode attributeを確認できます。

処理が完了した場合、returncodeの値はNoneにならず、データベースを更新できます。

+0

これは私の記事で述べたのと似ていますが、サブプロセスが完全かどうかをチェックできるテキストファイルにPIDを格納しています。戻りコードをチェックすることは、私がやろうとしていない別のスクリプトを後で実行することによって行われなければなりません。自動化されるアクションを投稿したい(サブプロセスが完了するとすぐに実行する必要があります)。 – Vinod

+0

あなたのプログラムがいくつかのプロセスを開始して終了するように言っていますか?そして、各サブプロセスが終了した後でデータベースの更新を実行したいのですか?完了後のコードはどこで実行されると想像できますか(つまり、どのプロセスコンテキストで)? – holdenweb

+0

そうです、メインのpythonスクリプトはインデックス作成操作をサブプロセスとして実行します。 「完了後のコードはどこで実行されるのでしょうか(つまり、どのプロセスコンテキストで)想像していますか?これは私が立ち往生した場所です。サブプロセスは、変更できない特定のプログラム/ファイルを呼び出します。そのため、DBを更新するために完了後スクリプトを含めることはできません。サブプロセスにコールバックがあることを望んでいましたが、おそらくこれを行うためのもっとpythonicな方法があります。 – Vinod

関連する問題