【问题标题】:Command Error: /usr/bin/env: 'ruby2.6': No such file or directory命令错误:/usr/bin/env: 'ruby2.6': 没有这样的文件或目录
【发布时间】: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


【解决方案1】:

解决问题的最简单方法是:

cd /var/www/myapp/vendor/cache/ruby/2.6.0/bin
ln -s /usr/bin/ruby2.6 .

这样,您的供应商 bin 文件夹中将有一个指向 ruby2.6 的链接,并且由于该文件夹位于您的 Web 服务器的路径中,它应该可以解决您的问题。

【讨论】:

    【解决方案2】:

    WickedPdf 在某些情况下试图通过调用which wkhtmltopdf 来找出wkhtmltopdf 的位置。在这里,它获取了一个调用 Ruby 2.6 的二进制存根 (binstub),但调用它的进程在其 PATH 中没有它。

    您可以像这样显式指定wkhtmltopdf 二进制文件的路径:

    WickedPdf.config = {
      exe_path: '/usr/local/bin/wkhtmltopdf'
    }
    

    理想情况下,这应该是实际二进制文件的直接路径,而不是 binstub,但是一些提供 wkhtmltopdf 作为二进制文件的 gem,使用 binstub 来根据执行它的平台切换二进制文件。

    如果使用其中之一,这样的东西应该可以工作:

    WickedPdf.config = {
      exe_path: "#{ENV['GEM_HOME']}/gems/wkhtmltopdf-binary-#{Gem.loaded_specs['wkhtmltopdf-binary'].version}/bin/wkhtmltopdf_linux_amd64"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 2011-04-08
      • 2013-03-11
      • 2019-12-11
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多