1

我正在尝试使用when gem 来执行几个rake 任务。似乎正确设置了 cron 任务 - 这里的信息来自生成的邮件输出。以下是执行命令的示例:

/bin/bash -l -c 'cd /path/to/deployed/app && RAILS_ENV=production

rake clean:my:task --silent'

以下是一些环境变量:

X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <PATH=/usr/bin:/bin>

这是以下错误:

/bin/bash: /usr/bin/rake: /usr/bin/ruby: bad interpreter: No such file or directory

当我登录时,我可以从同一目录运行这些 rake 任务,但是当我运行时

which ruby

我明白了

/usr/local/bin/ruby

/usr/bin 中似乎有一个“rake”,但正在运行

/usr/bin/rake -T

给了我同样的错误:

-bash: /usr/bin/rake: /usr/bin/ruby: bad interpreter: No such file or directory

解决此问题的最佳方法是什么?

4

4 回答 4

5

/usr/local/bin/ 在你的路径中吗?当你运行 which ruby​​ 你得到 /usr/local/bin/ruby 但是当你运行 rake 它正在寻找 /usr/bin/ruby

或者你可以像这样对红宝石进行符号链接:

sudo ln -s /usr/local/bin/ruby /usr/bin/.

于 2010-12-13T23:28:42.080 回答
1

这是我现在使用的:

every 1.day, :at => '5am' do
  # It appears that, when the following tasks are executed through
  #  cron, /usr/local/bin is not in the path (which is the ruby/RoR installation that should be used)
  #  So we need to make sure that the proper ruby/RoR installation can be found
  #  (Unfortunately this seems to restrict us to using the 'command' option, and leaves us unable
  #  to use the other options: 'runner' and 'rake' because i'm not sure how you'd affect the PATH
  #  environment variable for those)

  # (alot of what's below is just meant to provide a bit of visibility to the execution within cron)
  cmd_root = "PATH=/usr/local/bin:$PATH"
  cmd_root = cmd_root + " && "
  cmd_root = cmd_root + "export PATH"
  cmd_root = cmd_root + " && "
  cmd_root = cmd_root + "cd #{path}"
  cmd_root = cmd_root + " && "
  cmd_root = cmd_root + "pwd "
  cmd_root = cmd_root + " && "
  cmd_root = cmd_root + "echo $PATH"
  cmd_root = cmd_root + " && "
  cmd_root = cmd_root + "echo $RAILS_ENV"
  cmd_root = cmd_root + " && "
  cmd_root = cmd_root + "which ruby"

  # Execute the rake task, using 'command'
  cmd = cmd_root + " && rake clean:my:task param=val"
  command cmd

  # Without another way of manipulating the environment PATH, this isn't working right:
  #rake "clean:my:task"
end

由于我只是使用“命令”选项,它允许我在实际 rake 任务之前执行命令,例如将正确的目录添加到 PATH 以便使用正确的 ruby​​。

我对这如何硬编码对 /usr/local/bin 的引用并不感到疯狂,尽管 :-/。而且我不知道如何随时使用“rake”或“runner”选项。但它似乎正在工作。

于 2010-12-16T00:15:28.407 回答
0

我与 rakes 版本有冲突...我先用 apt-get 安装它,然后用 gem 安装它...所以我删除了每个版本...我什至不得不手动删除 /usr/local/bin/rake。仅使用 gem 重新安装,现在它可以工作了:) 希望它可以帮助某人。

于 2012-01-03T02:48:11.097 回答
0

在config/schedule.rb中添加以下代码行以设置正确的 ruby​​ 路径。

 env :PATH, ENV['PATH']

然后运行以下命令

whenever --update-crontab     #   to update crontab
service crond restart         #   to restart crontab
于 2015-10-26T09:53:49.503 回答