在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)它似乎没有解决提问者的问题(不幸的是,我只需要尝试就可以获得非平凡的周转时间)。 实际更新 它在这个页面的底部 ,我现在就试试吧。
更多信息
- 我无法修改cron命令,因为它是随时生成的
- 我validation如果我用
bash -l
创建一个新的bash shell,/ usr / bin / env发现ruby就好了 - 我只是在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
我希望这里的信息足够清楚。
- -bash:/ usr / local / bin / heroku:/ usr / local / bin / ruby:bad interpreter:没有这样的文件或目录
- 安装Homebrew时出错 – 找不到Brew命令
- 脚本在命令行中成功执行,但不是作为cronjob执行
- RVM加载了错误版本的ruby?
- brew install redis(osx 10.7)
- 有没有办法在Ruby中创建一个目录但是排除某些目录?
- .gsub(/ \ … /,“”)。worub(/ \(/,“”)。gsub(/ \)/,“”)。gsub(/ \ localhost /,“”)<=这是少数
- RVM不断向我的PATH添加目录,然后抛出警告未正确设置PATH
- 以编程方式测试任意用户是否可以访问任意文件