Подтвердить что ты не робот

Установка пути для всякого в cron, чтобы он мог найти рубин

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

подробнее

  • Я не могу изменить команду cron, потому что она генерируется всякий раз, когда
  • Я проверил, что если я создаю новую оболочку bash с bash -l,/usr/bin/env найдет рубин просто отлично
  • Я просто попробовал точную команду в cron, начиная с /bin/ bash, из командной строки этого пользователя, и она сработала.

так, это очень загадочно...

4b9b3361

Ответ 2

перепишите свой 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.

Надеюсь, это поможет.

Ответ 3

Как отметил Джон Бачир, вы можете сделать это через 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

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