繁体   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