【问题标题】:Only with cron: /usr/bin/env: ruby_executable_hooks: No such file or directory仅使用 cron: /usr/bin/env: ruby​​_executable_hooks: No such file or directory
【发布时间】:2015-10-07 13:07:56
【问题描述】:

我有一个使用 system() 调用 shell 命令的 perl 脚本,该命令使用 ruby​​_executable_hooks。

当我从命令行运行这个脚本时,它可以完美执行。

但是,当它从 cron 作业运行时,我收到以下两个错误之一: A)如果我不 chdir() 即。工作目录是 /home/foobar

/usr/bin/env: ruby_executable_hooks: No such file or directory

B) 如果我 chdir("[doc root]/cgi-bin")

/usr/lib/ruby/site_ruby/1.8/rubygems.rb:779:in `report_activate_error': Could not find RubyGem twurl (>= 0) (Gem::LoadError)
from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:214:in `activate'
from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:1082:in `gem'
from /home/foobar/.rvm/gems/ruby-1.9.3-p551/bin/twurl:22
from /home/foobar/.rvm/rubies/ruby-1.9.3-p551/lib/ruby/gems/1.9.1/bin/ruby_executable_hooks:15

从 cron 运行时找不到某些文件的原因可能是什么?

【问题讨论】:

  • 发布后我注意到 /usr/lib/ruby/site_ruby/1.8 被引用,而 twurl 在 1.9.3 下运行,而 1.9.3 是默认版本。我对 ruby​​ 了解得不够多,不知道这是否是个问题或如何解决它。
  • 你是说$ENV{PATH} 包含ruby_executable_hooks 的路径吗?那么这可能是一个权限问题。
  • cron 执行环境通常不是人们想象的那样。如果您运行的脚本仅是 id; pwd; env | sort (a)交互方式和(b)在 cron 下会发生什么?你看到意义的不同了吗?
  • 谢谢 Carl、ikegami 和 pilcrow。命令行的输出太长,无法在此处显示。我将缩短它并将其放在单独的评论中。这是 cron 作业的输出: HOME=/home/username LANG=C LOGNAME=username MAILTO=cron@servername.com PATH=/usr/bin:/bin PWD=/home/username SHELL=/bin/bash SHLVL =1 USER=用户名_=/usr/bin/env
  • 这是一个非常截断的命令行输出。我已经删除了不相关的东西和路径,这是在下一条评论中。 CLASSPATH=.:/usr/local/jdk/lib/classes.zip GEM_HOME=/home/username/.rvm/gems/ruby-1.9.3-p551 GEM_PATH=/home/username/.rvm/gems/ruby-1.9 .3-p551:/home/username/.rvm/gems/r‌​uby-1.9.3-p551@global IRBRC=/home/username/.rvm/rubies/ruby-1.9.3-p551/.irbrc MY_RUBY_HOME= /home/username/.rvm/rubies/ruby-1.9.3-p551 RUBY_VERSION=ruby-1.9.3-p551 rvm_bin_path=/home/username/.rvm/bin rvm_path=/home/username/.rvm rvm_prefix=/home /username rvm_version=1.26.11(最新)

标签: ruby perl cron


【解决方案1】:

这几乎肯定是您的环境变量的问题。从 cron 运行某些内容时,您的 .bashrc 未激活,因此可能设置的环境变量,例如您指向的 ruby​​ 版本以及您的 PATH 看起来可能不同。

如何解决此问题取决于您的环境以及您可能使用哪些工具(如果有)来选择您的 ruby​​ 版本(rvm、chruby、rbenv 等...)。

您可能想使用which ruby 之类的东西来准确确定要执行的 ruby​​ 并在您的 crontab 中使用它。

【讨论】:

    【解决方案2】:

    我在这里找到了答案: https://unix.stackexchange.com/questions/27289/how-can-i-run-a-cron-command-with-existing-environmental-variables

    具体来说,我只是把“.$HOME/.profile;”在 cron 命令前面是这样的:

    0 5 * * * 。 $HOME/.profile; /path/to/command/to/run

    感谢大家让我走上正轨。

    【讨论】:

    • 天啊,非常感谢!将近 15 个小时试图解决,现在它已修复。谢谢谢谢,谢谢
    【解决方案3】:

    我不太确定为什么会这样,但如果有人在 MacOS 上使用 RVM,这对我有用。我正在使用名为 backup 的 gem 运行数据库备份。我必须将 gem 放入我的应用程序的 Gemfile 中。不知道为什么我必须 cd 到应用程序目录。

    * * * * * source /Users/john/.rvm/environments/ruby-2.7.1; cd /path/to/app && bundle exec backup perform -t mybackup

    【讨论】:

      猜你喜欢
      • 2014-12-02
      • 2014-01-20
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      相关资源
      最近更新 更多