2012-04-24 13 views
1

サブプロセスを使用してプロセスを開始し、バックグラウンドで実行できるようにするのはサーバーアプリケーションです。プロセス自体は、薄いラッパーを持つJavaプログラムです(特に、Javaを明示的に呼び出すことなく実行可能ファイルとして起動できることを意味します)。1つではなく2つのプロセスを開始するサブプロセス

私はPopenを使用してプロセスを実行していますが、shell = Falseに設定すると実行されますが、1つではなく2つのプロセスが生成されます。最初のプロセスは親プロセスとしてinitを持っていますが、psで調べるとrawコマンドが表示されます。しかし、2番目のプロセスは展開されたjava引数(-Dと-Xフラグ)で表示されます。これはコマンドを手動で実行したときにどのように見えるか、どのように見えるかです。

興味深いことに、shell = Trueを設定すると、コマンドは失敗します。コマンドにはヘルプメッセージがありますが、引数リストに問題があるとは思われません(存在しないはずです)。 Popenの引数に名前を付けたシェル以外はすべて同じです。 私はUbuntuでPython 2.7を使用しています。何がここで起こっているのか分かりませんが、どんな助けもありがたいです。私は、javaコマンドがexec/forkを行っている可能性があり、何らかの理由で、Pythonで起動するときに親プロセスが死んでいない可能性があると思います。

このSO questionを見ましたが、これは有望そうですが、私が経験している動作を変更しません。

+0

この質問はかなり漠然としています。ラッパーと呼び出しの両方のソースがなくても、答えは推測です。言われているように、記載された症状を考えると、そのような推測を教育するためのかなり強力な根拠があります。 –

答えて

1

これは、実際にはPythonに比べてラッパーに関する質問です。他の言語から同じ動作をさせることになります。

exec java -D... -cp ... main.class.here "[email protected]" 

を前面にexecを欠いているとは対照的に、...:次のように

は、あなたが望む行動を取得するには、ラッパーは、JVMの外観を起動する行を持ってしたいと思います

java -D... -cp ... main.class.here "[email protected]" 

前者の場合、ラッパーのプロセスイメージは、で置き換えられ、は、呼び出すJVMのプロセスイメージと置き換えられます。後者では、ラッパーはJVMが終了するのを待ってから、実行を継続します。ラッパーが起きてからこれを防ぐことができますexecを使用して、JVMの終了後に任意のクリーンアップを行いますので、間違ったことだろう場合

- この場合、あなたはJVMの実行中に、まだとして、存在するラッパーたいですそうしないと、後でクリーンアップを実行できなくなります。

ラッパーがサブプロセスの切り離しを担当している場合、オープンするファイルハンドルを閉じてこれが正しく行われるようにする必要があることに注意してください。親プロセスにstdin、stdout、およびstderrのみが開いているよりも多くのファイル記述子がある場合は、close_fds=TrueをPopen呼び出しに渡すことを検討してください。

関連する問題