Не удается запустить PHP-скрипт cron

У меня есть PHP-скрипт, который мне нужно запускать каждую минуту. Я убедился, что сценарий работает из командной строки, и я использую абсолютные пути, чтобы избежать любых проблем среды:

/usr/bin/php -q /var/www/myapp/services/myservice.php 

В ручном режиме это как root из командной строки работает нормально, как я вижу из файла журнала, который пишет мой сценарий. Разумеется, у сценария есть разрешения на выполнение.

Однако при размещении одной и той же точной команды в cron:

 * * * * * /usr/bin/php -q /var/www/myapp/services/myservice.php 

Он не работает или, по крайней мере, так выглядит. Я попытался перенаправить вывод в другой файл журнала:

 * * * * * /usr/bin/php -q /var/www/myapp/services/myservice.php >> /mylog.log 2>&1 

Еще ничего. У меня нет никаких указаний на запуск сценария. Наверное, это не так, но я понятия не имею, что еще искать. Я даже перезапустил демона cron.

Я знаю, что есть похожие вопросы по StackOverflow, но ни один из ответов не оказался для меня решением. Это буквально сводит меня с ума, я буду очень признателен за любую помощь.

вы пропустили running user раздел running user :

 * * * * * nobody /usr/bin/php -q /var/www/myapp/services/myservice.php >> /mylog.log 2>&1 

Я нашел решение для своей проблемы:

https://serverfault.com/questions/97828/php-from-command-line-path-problems/97881#97881

Оказывается, мне нужно было cd (сменить каталог) в директорию скрипта, а затем вызвать его. Удивительно, поскольку я использую абсолютные пути, но это работает. Спасибо тем, кто нашел время ответить.

Обычно для перемещения исполняемого файла из командной строки в задание cron обычно требуется значительное количество вещей.

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

То, что я имею в виду, это выполнить:

 env | sed 's/^/export /' >$HOME/cron.env 

из сеанса входа в систему, чтобы получить полную среду, затем убедитесь, что мои задания cron выполняют этот скрипт, прежде чем пытаться выполнить настоящую работу. Получающемуся скрипту может потребоваться небольшое количество утилит (цитирование, удаление переменных переходной среды, таких как _ и PWD и т. Д.).

Таким образом, я могу быть уверен, что среды входа и cron идентичны.

Это можно считать «плохой практикой», но это работает для меня.

Запустите его с помощью завитка

 * * * * * curl -s http://www.domain.com/services/myservice.php