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

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

 #这不起作用
 PATH = / bin中:/ sbin目录:在/ usr / bin中:/ usr / sbin目录:在/ usr / local / sbin中

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

 #End每当生成任务时:foo

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

这个问题在schedule.rb中提供了env :PATH, "..."作为解决方案,但是(a)我在文档中的任何地方找不到该function的任何文档(b)它似乎没有解决提问者的问题(不幸的是,我只需要尝试就可以获得非平凡的周转时间)。 实际更新 它在这个页面的底部 ,我现在就试试吧。

更多信息

  1. 我无法修改cron命令,因为它是随时生成的
  2. 我validation如果我用bash -l创建一个新的bash shell,/ usr / bin / env发现ruby就好了
  3. 我只是在cron中尝试使用/ bin / bash中的确切命令,从该用户的命令行开始,然后就可以了。

所以,这很神秘……

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

 env :PATH, ENV['PATH'] 

这是我在这个主题上整理的一个小指南。

将您的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。

我希望这有帮助。

正如John Bachir指出的那样,你可以通过环境来做到这一点。 但是让我添加更多输入。 我正在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 

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