2013-11-07 2 views
8

Я пытаюсь выполнить следующий скрипт с помощью кронтаба:расслоение Exec не работает с кронтабом

#!/bin/sh 
cd /mnt/voylla-production/current 
bundle exec rake maintenance:last_2_days_orders 
bundle exec rake maintenance:send_last_2_days_payment_dropouts 

Запись кронтаба является

0 16 * * * /mnt/voylla-production/releases/20131031003111/voylla_scripts/cj_4pm.sh 

Я получаю следующее сообщение об ошибке в mail:

/mnt/voylla-staging/current/voylla_scripts/cj_4pm.sh: line 3: bundle: command not found 
/mnt/voylla-staging/current/voylla_scripts/cj_4pm.sh: line 4: bundle: command not found 

Я не получаю сообщение об ошибке при запуске команд вручную. Не уверен, что здесь происходит. Может кто-нибудь, пожалуйста, укажет.

Благодаря

+2

Вы используете RVM или что-то в этом роде? Задачи Cron выполняются в среде, отличной от вашей оболочки. Пути к рубину и драгоценные камни установлены неправильно. –

+0

Да, я использую RVM – nish

+1

Так что Google для «RVM crontab» :) –

ответ

26

Хороший трюк, чтобы все окружение правильно настроить в кронтаб является использование /bin/bash -l:

0 16 * * * /bin/bash -l -c '/mnt/voylla-production/releases/20131031003111/voylla_scripts/cj_4pm.sh' 

Опция -l будет вызывать полное имя пользователя shell, таким образом, считывая ваш файл bashrc и любые настройки path/rvm, которые он выполняет.

Если вы хотите упростить управление crontab и использовать этот трюк - как и другие - без необходимости думать о них, вы можете использовать Whenever gem. Он также играет очень хорошо с capistrano, если вы его используете, регенерируя crontab при развертывании.

6

Пользователь, используемые хроны не имеет правильную среду. Вы можете указать cron, какой пользователь использовать. Для Баш скрипт, вы можете так что-то вроде:

#!/bin/bash --login 
source /home/user/.bashrc 
rvm use [email protected] #if you use rvm 
cd /path/to/project && bundle exec xyz 
+0

Это также отличный ответ !, вы можете добавить к нему еще несколько строк. –

Смежные вопросы