【问题标题】:Running PhantomJS in Java process on AWS EC2 Linux在 AWS EC2 Linux 上以 Java 进程运行 PhantomJS
【发布时间】:2015-06-15 15:28:23
【问题描述】:

我在 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 文件。我预计该进程将运行一段时间,但“错误”响应发生在启动后。

出于测试目的,我为/home/ec2-user/reports/ 授予了chmod -R 777 权限,并为存储在/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,但它并没有解决我的问题。

【问题讨论】:

  • 您可以阅读进程的错误流以查看错误消息p.getErrorStream()
  • 我已经用@Titus 建议的结果更新了我的问题。

标签: java linux amazon-ec2 phantomjs


【解决方案1】:

我终于自己解决了这个问题。综上所述,从 Java 代码调用的 PhantomJS 进程的错误是:

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

可能会遇到此问题的一些人可能会遵循此建议:https://stackoverflow.com/a/22002485/3076403,但这并没有解决我的问题。

在我的情况下,问题是我将从 PhantomJS 运行的脚本文件存储在 /home/ec2-user/reports/renderer.js 中,但是在我将此脚本文件移动到 /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 文件夹中是不可能的(不需要额外的目录/文件权限)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-13
    • 2018-01-13
    • 2020-03-14
    • 2014-06-27
    • 1970-01-01
    • 2013-02-04
    • 2018-01-23
    • 1970-01-01
    相关资源
    最近更新 更多