【发布时间】:2020-10-04 18:20:32
【问题描述】:
我在生产服务器上遇到了问题,我们有一个 Rails 应用程序使用 gem wicked_pdf 生成 PDF,它抛出以下错误:
Failed to execute:
["/var/www/myapp/vendor/cache/ruby/2.6.0/bin/wkhtmltopdf", "file:////tmp/wicked_pdf20201004-5058-g9f64a.html", "/tmp/wicked_pdf_generated_file20201004-5058-1gjfrw5.pdf"]
Error: PDF could not be generated!
Command Error: /usr/bin/env: 'ruby2.6': No such file or directory
现在奇怪的是,这在 rake 任务中运行良好(rake 任务使用 sudo 执行)
当然,ruby 可以很好地解决:
$ which ruby
/usr/bin/ruby
$ which ruby2.6
/usr/bin/ruby2.6
$ ruby -v
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux-gnu]
$ echo $PATH
/home/julien/bin:/home/julien/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
Rails 应用以www-data 用户运行。
Ubuntu 16.04.5 LTS。
我的猜测是应用程序用来执行二进制文件的 bash 在其 $PATH 中缺少某些内容,或者我可能需要某个符号链接但我不知道,有什么想法吗?
如何调试它以了解问题出在哪里? 我如何检查并修改 Rails 加载的 shell PATH?
更新
Rails 应用使用 Nginx + Passenger 运行。
ENV['PATH'] 输出以下内容:
/var/www/myapp/vendor/cache/ruby/2.6.0/bin
这是生成 PDF 的代码的相关部分:
#generate the PDF
pdf = WickedPdf.new.pdf_from_string(
ActionController::Base.new.render_to_string(
template: 'templates/_doc',
locals: {
url: self.url,
signature: sig,
name: full_name,
title: "some title"
}
)
)
#save the file
save_path = Rails.root.join(PATH_TO_STORE_FILE, "some-filename-#{self.clean_url}.pdf")
File.open(save_path, 'wb') do |file|
file << pdf
end
【问题讨论】:
-
这可能是 PATH 问题。 www-data 与您自己的用户帐户不同,因此 PATH 设置不一样。你在什么系统下运行 Rails?阿帕奇乘客?有很多方法可以设置 PATH 来解决这个问题,但如果不了解所有细节,很难直接给出答案。
-
我建议在您的 Rails 页面之一上输出
ENV['PATH'],以进行初始调试。 -
还有调用
wkhtmltopdf的代码是什么样的。请在帖子中包含此代码。 -
@Casper 我已经添加了请求的信息,我很惊讶
EN['PATH']中的信息很少,难怪它找不到 ruby,我该如何更新?
标签: ruby-on-rails ruby ubuntu wicked-pdf