Установка пути для всякий раз в cron, чтобы он мог найти ruby
Мой рубин находится в /usr/local/bin. всякий раз, когда не удается найти его, и установка PATH в верхней части моего файла cron также не работает, я думаю, потому что всякий раз, когда выполняется команда внутри нового экземпляра bash.
# это не работает PATH=/ бен: / SBIN: / USR / бен: / USR / SBIN: / USR / местные / SBIN # Начать всякий раз, когда генерируются задачи для: 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 кажется мне грязным, но я думаю, что это может быть единственным вариантом.
Этот вопрос предлагает env :PATH, "..."
в schedule.rb в качестве решения, но (а) я не могу найти документацию по этой функции нигде в документации (б) она, похоже, не решила проблему автора (к сожалению, это требует нетривиального времени выполнения мне просто попробовать) обновить на самом деле это в нижней части этой страницы, я попробую это сейчас.
больше информации
- Я не могу изменить команду cron, потому что она генерируется
- я убедился, что если я сделаю новую оболочку bash с
bash -l
, / usr / bin / env находит ruby просто отлично - Я просто попробовал точную команду в cron, начиная с / bin / bash, из командной строки этого пользователя, и она сработала.
так что это очень загадочно...
3 ответа
Решение состоит в том, чтобы поместить это в 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. К сожалению, у них по умолчанию не установлен менеджер ruby (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
В промежуточной / производственной среде ruby может быть установлен в другом месте. Так что запуск этого может быть более подходящим:
bundle exec whenever --set 'environment=staging&env_path=/usr/bin/local' --update-crontab
Вам нужно будет заменить /usr/bin/local
с выходом echo $PATH
,
Однако в Opsworks мне нужно было создать собственный рецепт шеф-повара, который бы выглядел так:
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
Я надеюсь, что информация здесь достаточно ясна.