簡體   English   中英

Mac OSX上的Java進程似乎在通過Web服務器調用時“掛起”,但可以從命令行調用

[英]Java process on Mac OSX seems to “hang” when invoked via webserver, but OK from the commandline

我有一個非常奇怪的情況,當通過Apache / PHP調用時,Java進程似乎掛起,但是從命令行調用時可以正常。 我花了幾個小時調試這個,沒有用。 歡迎任何和所有的想法!

情況:我有一個.class文件(沒有原始Java代碼),它讀取輸入文件,處理讀取信息,並在stdout上寫入報告。 Java代碼不讀取stdin,只寫stdout。 我把它包裝在一個很小的Perl腳本中,基本上只執行“java -cp / path / to / classfile MyJavaProgram / path / to / inputfile / to / process”。 這樣我就可以從命令行調用它進行測試,這就像一個魅力。 接下來,我嘗試使用popen()從PHP調用它,並且Java只是掛起。 我在ps列表中看到了Perl進程和Java; 但Java進程永遠等待。 一旦我殺了它,webserver頁面就會繼續加載(但當然沒有Java進程會產生的預期輸出)。

到目前為止我嘗試了什么:

  • 在shell腳本中包裝Java進程,行為相同。 Java只是掛起。
  • 使用popen()從PHP運行它而不使用包裝器,行為相同。
  • 從PHP開始使用system()或passthru(),行為相同。
  • 在Perl包裝器中,為/ dev / null重新打開STDIN(以便讀取stdin立即返回EOF),行為相同。
  • 在Perl包裝器中,為/ dev / null重新打開STDERR,行為相同。
  • 在Perl包裝器中,為/ dev / null重新打開STDOUT。 在這里,我希望沒有輸出(因為它被丟棄),但Java進程仍然掛起。
  • 在Perl包裝器中,為/ dev / null重新打開所有3個流。 Java仍然懸而未決。
  • 用簡單的“ls -l / bin”替換Perl包裝器中的Java調用。 這按預期工作; 網頁上填充了“ls”列表。 所以問題不在PHP或Perl中。
  • 使用“/ bin / sh -c'java .....'”啟動Java進程。 相同的行為,Java掛起。
  • 在Perl包裝器中,我也轉儲環境變量,以檢查它們。 環境似乎沒問題。
  • 當Java進程運行時,我在ps列表中查找Perl包裝器調用,並將其復制/粘貼到命令行。 奇跡般有效。
  • 類似地,當Java進程掛起時,我在ps列表中查找調用,並將其復制/粘貼到命令行。 奇跡般有效。
  • 我還驗證了從Web服務器調用時輸入文件是否可讀。 使用與Apache用戶相同的用戶ID運行命令行的所有上述測試。

不幸的是,我不能用我控制的東西替換Java代碼。 我只有.class文件可以使用。 我還沒有嘗試過在Linux下運行它,所以這仍然可能是OSX特定的問題(這會讓我感到驚訝)。

這到底是怎么回事? 任何和所有“狂野”的想法都贊賞...謝謝!

從apache和cmd行檢查所有環境,包括路徑,UID等。

還要檢查掛起時java進程執行的操作(使用truss / tusc / strace -f java xxxxxxxxxxx 2> / tmp / trace。$$)從兩個位置(apache和cmdline)包裝它,然后比較結果。

另外,當從perl包裝時,在執行java之前將stofout,stdout,stderr的autoflush設置為1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM