首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当通过webserver调用时,Mac上的Java进程似乎会“挂起”,但从命令行则可以。

当通过webserver调用时,Mac上的Java进程似乎会“挂起”,但从命令行则可以。
EN

Stack Overflow用户
提问于 2013-04-27 12:57:25
回答 1查看 401关注 0票数 3

我遇到了一种非常奇怪的情况,Java进程在通过Apache/PHP调用时似乎挂起,而在从命令行调用时却没有问题。我花了几个小时调试这个,没有用。欢迎所有的想法!

情境:我有一个.class文件(没有原始的Java代码),它读取输入文件,处理读取的信息,并在stdout上写入报告。Java代码不读取stdin,只编写stdout。我把它封装在一个很小的Perl脚本中,它基本上只是执行"java -cp /path/to/classfile MyJavaProgram /path/to/inputfile/to/process“。这样我就可以从命令行调用它进行测试,这就像一种魅力。接下来,我尝试使用popen()从PHP调用它,然后Java就挂起了。我在ps列表和Java中看到了Perl进程;但是Java进程永远等待。一旦我杀死它,the服务器页面就会继续加载(当然,没有Java进程会生成的预期输出)。

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

  • 在shell脚本中包装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个流。爪哇还挂着。
  • 用简单的"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特有的问题(这会让我吃惊)。

这到底是怎么回事?任何“疯狂”的想法都值得赞赏..。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2013-04-30 16:10:46

检查apache和cmd行中的所有环境,包括路径、UID等。

还检查挂起时java进程所做的事情(在从两个地方(apache和cmdline)包装它时,请使用桁架/tusc/strace -f java xxxxxxxxxxx 2>/tmp/trace.$),然后比较结果。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16252375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档