Установка пути для всякий раз в cron, чтобы он мог найти ruby - PullRequest
17 голосов
/ 29 апреля 2011

Мой рубин находится в / usr / local / bin. всякий раз, когда не может его найти, и установка 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

Как мне узнать, где находится мой бинарный файл ruby?Создание символической ссылки из / usr / bin кажется мне беспорядочным, но я думаю, что это может быть единственным вариантом.

Этот вопрос предлагает env :PATH, "..." в schedule.rb в качестве решения,но (а) я не могу найти документацию по этой функции нигде в документации (б) кажется, что она не решила проблему задающего (к сожалению, мне требуется нетривиальное время выполнения, чтобы просто попробовать). обновление на самом деле это внизу этой страницы , я попробую сейчас.

подробнее

  1. Я не могу изменить команду cron, потому что она генерируется каждый раз, когда
  2. я проверял, что если я создаю новую оболочку bash с bash -l, / usr / bin / env находит ruby ​​просто отлично
  3. Я только что попробовал точную команду в cron, начиная с / bin / bash, из командной строки этого пользователя, и она сработала.

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

Ответы [ 3 ]

26 голосов
/ 04 мая 2011

Решение состоит в том, чтобы поместить это в schedule.rb:

env :PATH, ENV['PATH']

Вот небольшое руководство, которое я собрал по этой теме.

2 голосов
/ 29 апреля 2011

переписать ваш 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.*

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

0 голосов
/ 04 февраля 2014

Как отметил Джон Бачир, вы можете сделать это через env.Но позвольте мне добавить больше информации.Я размещаю на AWS Opsworks.К сожалению, у них по умолчанию не установлен менеджер ruby ​​(RVM, Rbenv и т. Д.).

Первое, что мне нужно было сделать, - это подключить SSH к экземпляру и выяснить, какой ruby ​​я использовал.Это было достаточно просто, выполнив команду which ruby в терминале.

$ which ruby
/usr/local/bin/ruby

Крон использовал 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

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

...