我在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 但它没有解决我的问题。
我终于自己解决了这个问题。综上所述,从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
文件夹中获取(不需要额外的目录/文件权限)。