На этот вопрос уже есть ответ здесь:
У меня есть скрипт php, который подключается к внешнему API, возвращает некоторые данные и обновляет таблицу базы данных. Я могу запустить его напрямую через командную строку / терминал SSH, и он отлично работает (занимает около 5 минут для завершения).
Используя crontab, я 'cron'ом' этот скрипт, поэтому он запускается каждые три часа, используя следующую команду:
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
В зависимости от используемой вами версии/типа 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
, то это не сработает.