1

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

Popen を使用してプロセスを実行しています。Shell=False を設定すると、プロセスは実行されますが、1 つではなく 2 つのプロセスが生成されます。最初のプロセスには親として init があり、ps を介して検査すると、生のコマンドが表示されるだけです。ただし、2 番目のプロセスは拡張された Java 引数 (-D フラグと -X フラグ) を使用して表示されます。

興味深いことに、shell=True を設定すると、コマンドが失敗します。コマンドにはヘルプ メッセージがありますが、引数リストに問題があることを示しているようには見えません (問題があるはずはありません)。Popen への shell という名前の引数を除いて、すべて同じです。UbuntuでPython 2.7を使用しています。ここで何が起こっているのかよくわかりませんが、助けていただければ幸いです。Java コマンドが exec/fork を実行している可能性があると思いますが、何らかの理由で、Python から起動したときに親プロセスが停止していません。

私は有望に見えたが、私が経験している行動を変えないこのSOの質問を見ました。

4

1 に答える 1

1

これは、実際には Python よりもラッパーに関する問題です。他の言語から実行すると、同じ動作が得られます。

必要な動作を実現するために、ラッパーは、JVM を呼び出す行を次のようにします。

exec java -D... -cp ... main.class.here "$@"

exec...前面に欠けているのとは対照的に:

java -D... -cp ... main.class.here "$@"

前者の場合、ラッパーのプロセス イメージは、それが呼び出す JVMのプロセス イメージに置き換えられます。後者の場合、ラッパーは JVM が終了するのを待ってから実行を続けます。

ラッパーが JVM の終了後に何らかのクリーンアップを行う場合、 を使用execするとこれが発生するのを防ぐことができるため、間違ったことになります。この場合、JVMの実行中にラッパーを引き続き存在させる必要があります。その後の掃除。

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

于 2012-04-24T12:03:34.823 に答える