Назад | Перейти на главную страницу

Последняя часть задачи cron не выполняется, не могу понять, почему

У меня проблема с cron на моем сервере, которая, я думаю, связана со средой или пользователем, под которым работает cron.

Мое приложение настроено под пользователем по имени deploy. Корневая папка для приложения /var/www/apps/akrotoski, а исполняемый файл приложения, который мне нужно запустить в этой задаче cron, находится во вложенной папке с именем bin и называется thoth.

Таким образом, моя задача cron создается путем ввода "crontab -e" при входе в систему как deploy пользователь:

# m h  dom mon dow   command
43 * * * *  echo "time = `date`, USER=$USER, current folder = `pwd`, which thoth = `which thoth`" >> ~/import_times.txt; cd /var/www/apps/akrotoski;  /var/www/apps/akrotoski/bin/thoth --run_command 'ExternalPost.import'

На данный момент он настроен на запуск каждый час, по прошествии 43 минут, поэтому я могу установить время, которое вот-вот должно произойти, а затем дождаться его запуска.

Первая часть с «эхом» - это просто я пытаюсь отладить, что происходит. Если я запустил это в своей командной строке, он запишет следующее в ~/import_times.txt:

time = Tue Nov 1 23:43:52 UTC 2011, USER=deploy, current folder = /var/www/apps/akrotoski, which thoth = /var/www/apps/akrotoski/bin/thoth

а затем запускает команду thoth (которая импортирует некоторые данные из Интернета).

Так что вроде все нормально - у него нужная папка, правильный пользователь, правильный exe. Однако строка, записанная в ~/import_times.txt по задаче cron выглядит так:

time = Tue Nov 1 23:43:01 UTC 2011, USER=, current folder = /home/deploy, which thoth =

Т.е. нет пользователя, который в свою очередь объяснил бы, почему which thoth не возвращает ничего, так как он получает местоположение из переменной PATH пользователя развертывания (или root). Заглянув в свою базу данных, я вижу, что ничего не было импортировано, поэтому мой вызов "thoth --run_command" не был выполнен должным образом.

Если я создаю crontab с помощью «crontab -e», войдя в систему как развертывание, разве это не будет работать под развертыванием? Может ли кто-нибудь объяснить мне, что может пойти не так?

спасибо макс

РЕДАКТИРОВАТЬ - для @ott ниже, который предложил мне вывести значение set - это то, что я получил от вызова set в cron:

HOME='/home/deploy'
IFS='   
'
LOGNAME='deploy'
OPTIND='1'
PATH='/usr/bin:/bin'
PPID='5948'
PS1='$ '
PS2='> '
PS4='+ '
PWD='/home/deploy'
SHELL='/bin/sh'

Путь значительно сокращен, но я все равно передаю полный путь к thoth exe в моей работе cron:

cd /var/www/apps/akrotoski; /var/www/apps/akrotoski/bin/thoth --run_command 'ExternalPost.import'

Вы видите, что чего-то не хватает set что потребуется для этой работы?

РЕДАКТИРОВАТЬ - я разработал ответ благодаря помощи @ ott, подробно описанной в комментариях ниже. Он находится ниже сгиба комментариев, поэтому для всех, кто просматривал это, проблема заключалась в том, что среда, в которой работал cron, знала о корзине ruby, но не знала, что ей нужно было открыть thoth exe с помощью ruby . Так что мне просто пришлось добавить «ruby» перед thoth exe, указав полный путь к корзине с рубинами, на всякий случай. Я все еще сначала перехожу в папку приложения, опять же, на всякий случай, со всеми полными путями это может не понадобиться:

0 * * * *  cd /var/www/apps/akrotoski; /usr/local/bin/ruby /var/www/apps/akrotoski/bin/thoth --run_command 'ExternalPost.import'

Измените свою команду, чтобы увидеть среду следующим образом:

( set ; echo "time = `date`, USER=$USER, current folder = `pwd`, which thoth = `which thoth`" ) >> ~/import_times.txt

Вы заметите очень уменьшенное окружение и PATH. Вы можете извлечь имя пользователя из переменной HOME.