首页 文章

在cron中设置路径,以便它可以找到ruby

提问于
浏览
17

我的红宝石在/ usr / local / bin中 . whenever也可以't find it, and setting PATH at the top of my cron file doesn'工作,我想是因为每当在新的bash实例中运行命令时 .

# this does not work
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin

# Begin Whenever generated tasks for: foo
0 * * * * /bin/bash -l -c 'cd /srv/foo/releases/20110429110637 && script/rails runner -e production '\''ActiveRecord::SessionStore::Session.destroy_recent(15)'\'''

# End Whenever generated tasks for: foo

我怎么能告诉我的ruby二进制文件在哪里?从/ usr / bin创建一个符号链接对我来说似乎很混乱,但我想这可能是唯一的选择 .

This question在schedule.rb中提供了 env :PATH, "..." 作为解决方案,但是(a)我似乎已经解决了提问者的问题(不幸的是,我只需要尝试就可以获得非平凡的周转时间) . update 实际上it is in the bottom of this page,我现在就试试吧 .

more info

  • 我可以随时生成't modify the cron command because it'

  • 我验证如果我用 bash -l 创建一个新的bash shell,/ usr / bin / env发现ruby就好了

  • 我刚刚在cron中尝试了命令,从/ bin / bash开始,从该用户的命令行开始,它运行正常 .

所以,这很神秘......

3 回答

  • 0

    将你的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 .

    我希望这有帮助 .

  • 26

    解决方案是将其放在 schedule.rb 中:

    env :PATH, ENV['PATH']
    

    Here's a little guide I put together on the topic.

  • 2

    正如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/local 替换为 echo $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
    

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

相关问题