3

Java プロセスが Apache/PHP 経由で呼び出されるとハングするように見えるが、コマンド ラインから呼び出されると問題ないという非常に奇妙な状況があります。これをデバッグするのに何時間も費やしましたが、役に立ちませんでした。どんな考えでも大歓迎です!

状況: 入力ファイルを読み取り、読み取った情報を処理し、stdout にレポートを書き込む .class ファイル (元の Java コードなし) があります。Java コードは stdin を読み取らず、stdout のみを書き込みます。これを、基本的に「java -cp /path/to/classfile MyJavaProgram /path/to/inputfile/to/process」を実行するだけの小さな Perl スクリプトにラップしました。そうすれば、テストのためにコマンドラインから呼び出すことができます。これは魅力のように機能します。次に、popen() を使用して PHP からこれを呼び出そうとすると、Java がハングアップします。ps リストに Perl プロセスと Java が表示されます。しかし、Java プロセスは永久に待機します。一度それを強制終了すると、Web サーバー ページは引き続きロードされます (ただし、Java プロセスが生成する期待される出力はもちろんありません)。

私がこれまでに試したこと:

  • シェル スクリプトで Java プロセスをラップすると、同じ動作になります。Java がハングするだけです。
  • ラッパーなしで popen() を使用して PHP から実行すると、同じ動作になります。
  • system() または passthru() を使用して PHP から起動すると、同じ動作になります。
  • Perl ラッパーで、/dev/null の STDIN を再度開く (stdin を読み取るとすぐに EOF が返されるようにする)、同じ動作。
  • Perl ラッパーで、/dev/null の STDERR を再度開くと、同じ動作になります。
  • Perl ラッパーで、/dev/null の STDOUT を再度開きます。ここでは、(破棄されるため) 出力はないと予想されますが、それでも Java プロセスはハングアップします。
  • Perl ラッパーで、/dev/null の 3 つのストリームすべてを再度開きます。Java はまだハングします。
  • Perl ラッパーの Java 呼び出しを単純な「ls -l /bin」に置き換えます。これは期待どおりに機能します。Web ページには「ls」リストが表示されます。したがって、問題は PHP や Perl にはありません。
  • 「/bin/sh -c 'java .....'」で Java プロセスを開始します。同じ動作で、Java がハングします。
  • Perl ラッパーでは、環境変数もダンプしてチェックします。環境は問題ないようです。
  • Java プロセスの実行中に、ps リストで Perl ラッパー呼び出しを検索し、コマンド ラインにコピー アンド ペーストします。魅力のように機能します。
  • 同様に、Java プロセスがハングしている場合は、ps リストで呼び出しを検索し、コマンド ラインにコピー アンド ペーストします。魅力のように機能します。
  • また、Web サーバーから呼び出されたときに入力ファイルが読み取り可能であることも確認しました。コマンド ラインを使用した上記のすべてのテストは、Apache ユーザーと同じユーザー ID を使用して実行されました。

残念ながら、Java コードを自分の管理下にあるものに置き換えることはできません。作業する .class ファイルしかありません。私がまだ試していないのは、これを Linux で実行することです。そのため、これはまだ OSX 固有の問題である可能性があります (これには驚きます)。

ここで一体何が起こっているのですか?あらゆる「ワイルド」なアイデアを歓迎します..ありがとう!

4

1 に答える 1

0

パス、UIDなどを含む、Apacheおよびコマンドラインからのすべての環境を確認してください。

また、両方の場所 (apache と cmdline) からラップするときに、ハングしたときに Java プロセスが何をするかを確認し ( truss/tusc/strace -f java xxxxxxxxxxx 2>/tmp/trace.$$ を使用)、結果を比較します。

また、perl からラップする場合は、java を実行する前に、stdin、stdout、stderr の autoflush を 1 に設定します。

于 2013-04-30T16:10:46.243 に答える