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

Кажется, что Cron запускается, но не выполняется так же, как при запуске вручную с терминала

У меня есть скрипт php, который подключается к внешнему API, возвращает некоторые данные и обновляет таблицу базы данных. Я могу запустить это напрямую через мою командную строку / терминал SSH, и он отлично работает (для завершения требуется около 5 минут).

Используя crontab, я добавил этот сценарий, поэтому он запускается каждые три часа, используя следующую команду:

0 */3 * * * /usr/bin/php /var/acme/cron/api_update_db.php

Используя системный журнал, я вижу, что этот cron запущен, но похоже, что cron действительно запускается каждые три часа, как и ожидалось, однако база данных, похоже, не обновлялась? Но когда я сам запускаю тот же самый скрипт вручную, перейдя в этот каталог и введя следующее, он запускается (и обновляет БД)

php api_update_db.php

Будет ли причина для этого выполнения по-другому при запуске из задания cron, чем при запуске вручную с терминала (который, похоже, работает).

Возможно, вы получите вывод stderr \ stdout, который может помочь определить проблему. Обычно это заканчивается отправкой вам по почте, но если нет, попробуйте добавить конкретное перенаправление всего вывода в конец вашей записи crontab в файл, например:

0 */3 * * * /usr/bin/php /var/acme/cron/api_update_db.php &> /tmp/cron.output
crontab -u <username> -e 

Короткий ответ, запустите cron как пользователь с соответствующими учетными данными в базе данных. Источник

В зависимости от версии / типа cron, которые вы используете, выходные данные команды обычно отправляются кому-то по электронной почте. В традиционном стиле можно поставить

MAILTO=your.login

а может даже

MAILTO=your_email@example.com

и получите вывод из сценария.

В худшем случае попробуйте

0 */3 * * * /usr/bin/php /var/acme/cron/api_update_db.php > /tmp/cron.output 2> /tmp/cron.error

С помощью &> вероятно, не будет работать - cron выполняется с использованием /bin/sh что скорее всего не bash и &> не входит в стандарт POSIX, это bash расширение (возможно, используется и другими оболочками, но не всеми).

Еще одна вещь, на которую следует обратить внимание, это то, что это выполняется без каких-либо переменных среды и т. Д. Итак, если у вас есть учетные данные для БД, установленные как переменная среды в .bashrc чем это не сработает.