18

我的红宝石在 /usr/local/bin 中。每当找不到它,并且在我的 cron 文件顶部设置 PATH 也不起作用,我认为是因为每当在新的 bash 实例中运行命令时。

# 这不起作用
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin

# 每当生成任务时开始: foo
0 * * * * /bin/bash -l -c 'cd /srv/foo/releases/20110429110637 && script/rails runner -e production '\''ActiveRecord::SessionStore::Session.destroy_recent(15)'\' ''

# 每当生成任务时结束: foo

我怎么知道我的红宝石二进制文件在哪里?从 /usr/bin 建立符号链接对我来说似乎很乱,但我想这可能是唯一的选择。

这个问题在 schedule.rb 中提供env :PATH, "..."了一个解决方案,但是(a)我在文档中的任何地方都找不到该功能的任何文档(b)它似乎没有解决提问者的问题(不幸的是,它需要不平凡周转时间让我尝试一下)。 更新实际上它在这个页面的底部,我现在就试试。

更多信息

  1. 我无法修改 cron 命令,因为它是由任何时候生成的
  2. 我验证了如果我用 制作一个新的 bash shell bash -l,/usr/bin/env 发现 ruby​​ 就好了
  3. 我刚刚从该用户的命令行尝试了 cron 中的确切命令,从 /bin/bash 开始,它起作用了。

所以,这很神秘……

4

3 回答 3

28

解决方案是将其放入schedule.rb

env :PATH, ENV['PATH']

这是我就该主题整理的一个小指南。

于 2011-05-04T05:30:28.677 回答
2

将您的 crontab 重写为

0 * * * * { PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin ; export PATH ;/bin/bash -l -c 'cd /srv/foo/releases/20110429110637 && script/rails runner -e production '\''ActiveRecord::SessionStore::Session.destroy_recent(15)'\''' ; }

或者您应该尝试弄清楚为什么您的 BASH shell 没有选择 PATH=...,这几乎可以肯定是在您的 .profile 或 .bash_profile 中。

我希望这有帮助。

于 2011-04-29T18:12:25.927 回答
1

正如 John Bachir 指出的那样,您可以通过env. 但让我添加更多输入。我正在 AWS Opsworks 上进行部署。不幸的是,他们没有默认安装 ruby​​ 管理器(RVM、Rbenv 等)。

我需要做的第一件事是通过 SSH 连接到实例并找出我正在使用的 ruby​​。which ruby通过在终端中执行命令,这很容易。

$ which ruby
/usr/local/bin/ruby

Cron 使用位于/usr/bin/ruby. 这需要改变。

在 schedule.rb 中,我有:

set :env_path, ''
env :PATH, @env_path if @env_path.present?

在本地,env_path不需要设置。对于大多数用户来说,唯一要做的就是在以下情况下执行:

bundle exec whenever --set 'environment=development' --update-crontab

在暂存/生产环境中,ruby 可能安装在其他地方。所以运行这个可能更合适:

bundle exec whenever --set 'environment=staging&env_path=/usr/bin/local' --update-crontab

您将需要替换/usr/bin/localecho $PATH.

然而,在 Opsworks 中,我需要创建一个自定义的 Chef 食谱,如下所示:

node[:deploy].each do |application, deploy|
  execute 'whenever' do
    user 'deploy'
    group 'nginx'
    cwd "#{deploy[:deploy_to]}/current"
    command "bundle exec whenever --set 'environment=#{deploy[:environment_variables][:RAILS_ENV]}&env_path=#{ENV['PATH']}' --update-crontab"
  end
end

我希望这里的信息足够清楚。

于 2014-02-04T06:18:21.917 回答