Почему 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 будет выполняться каждую минуту, и каждую минуту в файле журнала будет запись

Если в записи нет, то ковер даже не выбирает эту запись. Если он есть и до сих пор не работает, значит, что-то не так с командой