Установка пути для всякий раз в 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 в качестве решения, но (а) я не могу найти документацию по этой функции нигде в документации (б) она, похоже, не решила проблему автора (к сожалению, это требует нетривиального времени выполнения мне просто попробовать) обновить на самом деле это в нижней части этой страницы, я попробую это сейчас.

больше информации

  1. Я не могу изменить команду cron, потому что она генерируется
  2. я убедился, что если я сделаю новую оболочку bash с bash -l, / usr / bin / env находит ruby ​​просто отлично
  3. Я просто попробовал точную команду в 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

Я надеюсь, что информация здесь достаточно ясна.

Другие вопросы по тегам