在Ubuntu上执行Java:当控制台工作正常时,PHP exec()无效

时间:2012-12-16 09:34:29

标签: java php ubuntu permissions exec

我的网站需要PHP在后台运行Java程序。因此,PHP发布exec()方法让Java完成所有工作。该实现在Windows上运行正常,但在Ubuntu上完全失败。虽然exec()不起作用,但使用控制台的独立测试工作正常。

我已设置test.php以缩小问题范围:

<?php
$output = exec("java -cp ~/path/to/java/class/file/folder Hello 2>&1");
//$output = exec("whoami");
echo $output;
?>


Hello.java只是:

public class Hello {
   public static void main(String[] args) {
      System.out.println("Hello, world!");
   }
}


通过在localhost上运行test.php,它显示:

Error: Could not find or load main class Hello


我试图缩小错误的原因,我的想法是这样的:

  1. exec()本身存在问题:

    不太可能,因为whoami按预期打印出apache-user。

  2. 错误消息的含义:

    我搜索了这个错误。像this one这样的帖子谈论它是由缺少classpath 引起的。 对我来说情况并非如此,因为在控制台中它可以正常工作。所以错误信息没有任何意义(是吗?)

  3. 用户/组权限:

    是否有可能不允许apache-user运行类文件?
    我查了一下,发现Hello.class的权限代码为rw-r--r--,由apache-user:webmasters拥有。
    但是,即使没有人拥有该文件的x权限,在控制台中我仍然可以运行它(使用我自己的用户)。
    我不确定这里的情况。但我的理解是,通过运行java程序,它真的JVM执行它(或其他东西);所以Hello.class的许可无关紧要。


    我发现另一个post有类似的情况。但它的解决方案 - 指定Java bin /usr/bin/java的完整路径 - 对我来说不起作用......

  4. 是什么导致错误?

    有人可以帮忙吗?详细解决方案表示赞赏我是新手@ _ @

    非常感谢!!!

3 个答案:

答案 0 :(得分:0)

你试过java -cp /path/to/folder/containing/class/file Hello 2>&1吗?看来类文件本身不应该是类路径。它应该是 in 类路径。另一方面,如果这是一个.jar文件,那么你将在类路径中提供文件名。

答案 1 :(得分:0)

免费提供路径和Hello.java文件。

使用以下命令测试apache用户的权限:

sudo -u webmasters java -cp /path/to/java/class/file/folder Hello

chmod a+r Hello.class

答案 2 :(得分:0)

我已经解决了这个问题......这是非常意外的。

我更改了类路径。

以前它就像~/myproject/to/java/class/file/folder。 然后我将其更改为/home/myuser/myproject/to/java/class/file/folder

但我完全不明白为什么~符号不适用于exec()