У меня проблема с 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.