在AWS EC2 Linux上的Java进程中运行PhantomJS

时间:2015-06-15 15:28:23

标签: java linux amazon-ec2 phantomjs

我在Linux EC2(ELB)实例上从Java代码运行PhantomJS进程时遇到问题。相同的代码在Windows操作系统(我的本地开发)上正常工作,其中PhantomJS进程运行脚本,生成PDF文件并返回预期的0退出值。问题仅发生在EC2 Linux实例上。我将简要介绍一下到目前为止所做的工作。

我已经使用以下命令在EC2实例上成功安装了PhantomJS:

cd /usr/local/share
sudo wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.7-linux-x86_64.tar.bz2
sudo tar xjf phantomjs-1.9.7-linux-x86_64.tar.bz2
sudo ln -s /usr/local/share/phantomjs-1.9.7-linux-x86_64/bin/phantomjs /usr/local/share/phantomjs
sudo ln -s /usr/local/share/phantomjs-1.9.7-linux-x86_64/bin/phantomjs /usr/local/bin/phantomjs
sudo ln -s /usr/local/share/phantomjs-1.9.7-linux-x86_64/bin/phantomjs /usr/bin/phantomjs

要检查一切是否正常运行,我从bash窗口调用了我想要的命令。它正确生成预期的PDF文件:

phantomjs /home/ec2-user/reports/renderer.js "http://localhost:8080/report.html" /home/ec2-user/reports/tmp/report.pdf Letter

负责调用PhantomJS进程的源代码片段如下所示:

try {
    final ProcessBuilder pb = new ProcessBuilder("phantomjs", "/home/ec2-user/reports/renderer.js", "http://localhost:8080/report.html", "/home/ec2-user/reports/tmp/report.pdf", "Letter");
    final Process p = pb.start();
    p.waitFor();

    final int exitValue = p.exitValue();
    if (exitValue == 0) {
        LOG.info("PhantomJS has produced valid PDF");
    } else {
        LOG.debug("PhantomJS failed to produce PDF file");
    }
} catch (final InterruptedException | IOException e) {
    e.printStackTrace();
}

renderer.js脚本来自:https://github.com/ariya/phantomjs/blob/master/examples/rasterize.js,几乎没有任何修改。

注意:我还尝试在安装时用phantomjs和其他已创建的系统链接替换/usr/local/share/phantomjs-1.9.7-linux-x86_64/bin/phantomjs命令。

在运行上面的代码时,Java端没有例外。只是退出值不是0并且没有生成PDF文件。我预计这个过程会运行一段时间,但是"错误"响应在刚开始后发生。

出于测试目的,我为chmod -R 777授予了/home/ec2-user/reports/权限,并为/usr/local/share/phantomjs-1.9.7-linux-x86_64/bin/phantomjs中存储的PhantomJS应用授予了777。

我将非常感谢您的帮助和所有建议。如果我省略一些重要信息,请向我询问更多细节。

编辑:正如@Titus建议的那样,我已经阅读了错误流并最终得到了错误:

  

无法打开' /home/ec2-user/reports/renderer.js'

任何想法可能是什么问题?我遵循了这个建议:https://stackoverflow.com/a/22002485/3076403但它并没有解决我的问题。

1 个答案:

答案 0 :(得分:0)

我终于自己解决了这个问题。总而言之,从Java代码调用的PhantomJS进程的错误是:

Can't open '/home/ec2-user/reports/renderer.js'

有些人会遇到此问题可能会遵循以下建议:https://stackoverflow.com/a/22002485/3076403但它无法解决我的问题。

在我的情况下,问题是我将我的脚本文件存储在/home/ec2-user/reports/renderer.js中的PhantomJS中,但是在我将此脚本文件移动到/var/local/renderer.js后,它从Java进程调用中正确运行。我不知道:

/var/local -> stores variable data for local programs (i.e., programs that have been installed by the system administrator) that are installed in /usr/local.

引自:http://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/var.html

幸运的是,将生成的PDF文件存储在/var/local/tmp目录中也可以从Java应用程序中获取这些文件,而这些文件无法从/home/ec2-user/reports/tmp文件夹中获取(不需要额外的目录/文件权限)。