Почему crontab не выполняет мой PHP скрипт?
Я создал один файл php для проверки некоторого результата, поэтому мне нужно настроить cronjob.
Я запускаю его каждые 30 минут, чтобы результаты были отправлены. Тем не менее, я не знаю, почему мой crontab не запускался каждые 30 минут.
Вот как я устанавливаю crontab:
*/30 * * * * php /var/www/html/result.php
Я подтвердил, что мой каталог файлов верен. Что я не уверен в части времени: нельзя ли использовать */30 * * * *
или 30 * * * *
? Я установил */30 * * * *
и не работал.
Ответы
Ответ 1
Учитывая
*/30 * * * * php /var/www/html/result.php
Существует несколько возможностей, почему он не работает:
1) Прежде всего важно проверить, выполнено ли простое выполнение php /var/www/html/result.php
. Это необходимо. Но, к сожалению, выполнение этого не означает, что проблема решена.
2) Должен быть добавлен путь двоичного файла php
.
*/30 * * * * php /var/www/html/result.php
чтобы изменить на
*/30 * * * * /usr/bin/php /var/www/html/result.php
или что-то, что приходит из which php
.
3) Проверьте разрешение script на пользователя, выполняющего crontab.
Предоставить разрешение на выполнение для файла: chmod +x file
. И убедитесь, что crontab запускается пользователем, имеющим права на выполнение script. Также проверьте, может ли пользователь получить доступ к каталогу, в котором находится файл.
4) Чтобы быть более безопасным, вы также можете добавить php-путь в верхней части script, например:
#!/usr/bin/php -q
<?php
...
?>
5) Убедитесь, что пользователь имеет права использовать crontab. Проверьте, находится ли он в файле /etc/cron.d/deny
. Кроме того, сделайте базовый тест, чтобы узнать, является ли это проблемой crontanb или php.
* * * * * touch /tmp/hello
6) Выведите результат script в файл журнала, как предложил Уильям Ниу.
*/30 * * * * /usr/bin/php /var/www/html/result.php > /tmp/result
7) Используйте параметр -f
для выполнения script:
*/30 * * * * /usr/bin/php -f /var/www/html/result.php > /tmp/result
Подводя итог, существует много возможных причин. Один из них должен решить проблему.
Ответ 2
Возможно, это связано с тем, что php не находится в пути. crontab
имеет минимальное значение path
. Итак, включите полный путь для вашей php-программы.
вы можете протестировать свои команды cron, отправив вывод в файл, например.
*/30 * * * * php /var/www/html/result.php > /tmp/result.log
От эта справочная страница в разделе "Crontab Environment":
cron вызывает команду из каталога HOME пользователя с помощью shell, (/usr/bin/sh). cron предоставляет среду по умолчанию для каждого оболочка, определяющая:
HOME=user’s-home-directory
LOGNAME=user’s-login-id
PATH=/usr/bin:/usr/sbin:.
SHELL=/usr/bin/sh
Кроме того, синтаксис /30
может не поддерживаться всеми платформами, поэтому вместо этого попробуйте изменить его на 0,30
.
Ответ 3
У меня была аналогичная проблема на Ubuntu 14.04.1
, и проблема оказалась так, как я модифицировал crontab:
Я использовал sudo crontab -e
вместо просто crontab -e
, и это заставило мои изменения игнорировать.
Ответ 4
Была аналогичная проблема; из командной строки это сработало, но из cron, не нужно.
имел "include (". /connect.php "), в моем php-коде для материала db.
Удалено это и добавлено код connect.php непосредственно в php script, и он работал от cron.
Ответ 5
После дня озадачивания, почему мой script будет работать напрямую (чтобы отправить данные в электронном письме на учетную запись gmail), я обнаружил, что все преднамеренные отправки работали, когда я щелкнул по URL-адресу, и все сообщения cron попали в спам. Не знаю, почему, но я думал, что поделюсь им.
Ответ 6
Ответ Виллема показал мне путь. В моем случае у меня есть "include (" connection.php ") внутри моего кода. Я изменил connection.php на /my/full/path/connection.php. У меня есть несколько переименований() с относительным путем, и я перешел на абсолютный путь. Это сработало для меня. Надеюсь, это поможет кому-то другому.
Ответ 7
Легкий и логичный способ:
Проверка журналов cron в /var/log/cron даст вам очень полезную информацию
less/var/log/cron
Eg.
Моя запись cron * * * * * /usr/bin/php /cat.php
< == Run cat.php каждую минуту
Файл журнала будет содержать запись, подобную приведенной ниже, каждый раз, когда выполняется запись cron
Jan 24 08:06:01 OlaTower CROND[13641]: (root) CMD (/usr/bin/php /cat.php)
Jan 24 08:07:01 OlaTower CROND[13641]: (root) CMD (/usr/bin/php /cat.php)
Здесь команда php будет выполняться каждую минуту, и каждую минуту в файле журнала будет запись
Если в записи нет, то ковер даже не выбирает эту запись. Если он есть и до сих пор не работает, значит, что-то не так с командой