Ответ 1
Решение состоит в том, чтобы поместить это в schedule.rb
:
env :PATH, ENV['PATH']
Мой ruby находится в /usr/local/bin. whenever не может найти его, и установка PATH в верхней части моего cron файла тоже не работает, я думаю, потому что всякий раз, когда запуск команды внутри нового экземпляра 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
Как я могу указать, где мой бинарный бин? Создание символической ссылки из /usr/bin кажется беспорядочным для меня, но я предполагаю, что это единственный вариант.
Этот вопрос предлагает env :PATH, "..."
в schedule.rb как решение, но (а) я не могу найти документацию об этой функции в любом месте документа ( б) он, похоже, не решил проблему с аськой (к сожалению, для меня просто требуется нетривиальное время поворота).
обновить на самом деле он находится внизу этой страницы, я попробую сейчас.
подробнее
bash -l
,/usr/bin/env найдет рубин просто отличнотак, это очень загадочно...
Решение состоит в том, чтобы поместить это в 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 не выбирает PATH =... это почти наверняка в вашем .profile или .bash_profile.
Надеюсь, это поможет.
Как отметил Джон Бачир, вы можете сделать это через env
. Но позвольте мне добавить больше информации. Я развертываю на AWS Opsworks. К сожалению, у них нет рубинового менеджера (RVM, Rbenv и т.д.), Установленных по умолчанию.
Первое, что мне нужно было сделать, это SSH в экземпляр и выяснить, какой рубин я использовал. Это было достаточно просто, выполнив команду which ruby
в терминале.
$ which ruby
/usr/local/bin/ruby
Крон использовал рубин, расположенный в точке /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
В промежуточной/производственной среде рубин может быть установлен в другом месте. Поэтому выполнение этого может быть более подходящим:
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
Я надеюсь, что информация здесь достаточно ясна.