У меня есть скрипт 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
чем это не сработает.