Cron, выполняющий задачу rake, не смог найти rake-0.8.7 ни в одном из источников

Я пытаюсь настроить задание cron, выполняющее задачу rake. Я использую драгоценный камень всякий раз, когда. Вот конфигурация в config/schedule.rb

every 1.minutes do
  bundle exec rake "test:pick_participant"
end

Кронтаб настроен правильно, когда:

* * * * * /bin/bash -l -c 'cd /home/jsmith/webapp/releases/20111104200246 && RAILS_ENV=production bundle exec rake test:pick_participant --silent'

Однако Cron продолжает сообщать (по почте) об этой ошибке каждый раз при запуске задания:

From: [email protected] (Cron Daemon)
To: jsmith@SEQUOIA
Subject: Cron <jsmith@SEQUOIA> /bin/bash -l -c 'cd /home/jsmith/webapp/releases/20111104200246 && RAILS_ENV=production bundle exec rake test:pick_participant --silent'
Content-Type: text/plain; charset=ANSI_X3.4-1968
X-Cron-Env: <MAILTO=jsmith@SEQUOIA>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/jsmith>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=jsmith>
Message-Id: <[email protected]>
Date: Mon,  7 Nov 2011 16:26:01 -0800 (PST)
expr: syntax error
Could not find rake-0.8.7 in any of the sources

Грабли, входящие в состав среды приложения, имеют версию 0.8.7.

Команда, выданная Cron, кажется правильной:

/bin/bash -l -c 'cd /home/jsmith/webapp/releases/2067320376 && RAILS_ENV=production bundle exec rake test:pick_participant --silent'

он вызывает bundle exec rake вместо rake напрямую.

Также, если я выполню ту же команду в командной строке внутри каталога приложения, задача rake запустится успешно:

jsmith@SEQUOIA:~/webapp/current$ /bin/bash -l -c 'cd /home/jsmith/webapp/releases/20111104200246 && RAILS_ENV=production bundle exec rake test:pick_participant --silent'

* picked participant: Mindy!

У кого-нибудь есть идеи, почему Cron выдает эту ошибку «не удалось найти rake-0.8.7»?


person Karen W    schedule 08.11.2011    source источник


Ответы (2)


Я исправил проблему.

Было две проблемы, как сообщалось в выводе ошибок Cron:

expr: syntax error
Could not find rake-0.8.7 in any of the sources

Вот как я их исправил после поиска и отладки в Google:

  1. exp: syntax error относится к моей установке Ubuntu 10.4 LTS. Чтобы это исправить, в файле /etc/profile.d/speechd-user-port.sh замените строку

    export SPEECHD_PORT=$(expr 6560 + $(getent passwd $USER | cut -f 3 -d :))
    

    с участием

    [ "$PS1" != "" ] && export SPEECHD_PORT=$(expr 6560 + $(getent passwd $USER | cut -f 3 -d :))
    

    Расширение переменной $USER вызывает синтаксическую ошибку. Это ошибка в пакете диспетчера речи Ubuntu 10.4. Подробные пояснения смотрите здесь:

    Ошибка Ubuntu #790173 Cron не отправляет выходные данные должным образом Комментарий 6

    ошибка Ubuntu#601114 /etc/profile.d/speechd-user- port.sh ссылается на $USER

  2. После исправления синтаксической ошибки я продолжал получать ошибку Could not find rake-0.8.7 in any of the sources.

    Это произошло из-за того, что RVM не был загружен в моем сеансе входа в систему. Эта строка, которая является источником функции rvm

    [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
    

    был только в ~/.bashrc и нет в ~/.bash_profile.

    Файл ~/.bashrc загружается для интерактивной оболочки без входа в систему, а ~/.bash_profile загружается для оболочки входа в систему, которая загружается переключателем -l в команде задания Cron "/bin/bash -l"

    Это была моя вина. На веб-сайте RVM прямо указано, что нужно поместить строку в ~/.bash_profile.

    Добавив строку в ~/.bash_profile, задание Cron успешно загружает среду RVM. Теперь мои рейк-задачи Cron работают без сбоев.

Вот несколько вещей, которые я узнал при отладке проблемы:

  • Среда задания Cron отличается от командной строки оболочки входа в систему. Среда Cron намного более пустая, и в ней не так много загруженных путей/профилей, как в оболочке входа. Вот почему команда может работать в командной строке, но не как задание Cron.

  • Вырезав Ruby on Rails и rake, я отлаживал Cron, выполняя простейшие команды с такими записями в crontab:

    * * * * * /bin/bash -l -c 'pwd’
    * * * * * /bin/bash -l -c 'echo $PATH’
    

    Или это в config/schedule.rb.

    every 1.minutes do
      rake "--version"
      command "rvm info"
    end
    

    Эти простые команды заставили меня понять, что «expr: синтаксическая ошибка» была чем-то фундаментальным, не связанным с Cron или RoR, а ошибка rake была связана с неправильной загрузкой RVM.

  • существует разница между .bashrc и .bash_profile.

person Karen W    schedule 09.11.2011
comment
Спасибо за упоминание /bin/bash -l -c в crontab. Это также решило мои проблемы с упаковщиком. - person Roman; 04.09.2012
comment
Отличный ответ. Спасибо, что поделились своим решением. - person gak; 01.02.2013

Вы всегда можете просто загрузить среду RVM с помощью CRON, и тогда вы сможете запустить любую задачу rake, например:

0 * * * * /home/user/.rvm/bin/rvm use ree-1.8.7-2011.03 rake name:task

Где ree-1.8.7-2011.03 — имя гемсета для загрузки, введите rvm list, чтобы увидеть ваши гемсеты. Использование файла сценария вместо однострочного в вашем crontab упрощает управление, вы также можете использовать приведенную выше команду в файле сценария.

person edwardsharp    schedule 14.05.2012