MacOSX上的Java进程似乎;“挂起”;通过Web服务器调用时,但从命令行确定

MacOSX上的Java进程似乎;“挂起”;通过Web服务器调用时,但从命令行确定,java,php,perl,apache,Java,Php,Perl,Apache,我遇到了一个非常奇怪的情况,当通过Apache/PHP调用Java进程时,该进程似乎挂起,但当从命令行调用时,该进程是正常的。我花了几个小时调试这个,没有用。欢迎任何意见 情境:我有一个.class文件(没有原始Java代码),它读取输入文件,处理读取的信息,并在stdout上编写报告。Java代码不读取stdin,只写入stdout。我将其包装在一个小的Perl脚本中,基本上只执行“java-cp/path/to/classfile MyJavaProgram/path/to/inputfil

我遇到了一个非常奇怪的情况,当通过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进程永远都在等待。一旦我杀死它,Web服务器页面将继续加载(当然没有Java进程将生成的预期输出)

到目前为止,我尝试的是:

  • 在shell脚本中包装Java进程,同样的行为。Java只是挂起
  • 在PHP中使用popen()运行它,而不使用包装器,行为相同
  • 使用system()或passthru()从PHP启动,行为相同
  • 在Perl包装器中,为/dev/null重新打开STDIN(以便读取STDIN立即返回EOF),行为相同
  • 在Perl包装器中,重新打开/dev/null的STDERR,同样的行为
  • 在Perl包装中,重新打开/dev/null的标准输出。在这里,我希望没有输出(因为它被丢弃),但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等

另外,在从两个位置(apache和cmdline)包装java进程时,还要检查挂起时java进程的行为(使用truss/tusc/strace-f java xxxxxxxxxx 2>/tmp/trace.$$),然后比较结果


另外,从perl包装时,在执行java之前,将stdin、stdout、stderr的autoflush设置为1。

java可能需要显示,并且“headless模式”尚未启用,因此它在桌面上工作,而不是在服务器上。