php /var/www/html/*.php не работает в терминале, который открыт из меню. php *.php работает в терминале, который открыт внутри папки php, содержащей
Я хочу запустить PHP-скрипт из cron. Я устанавливаю cron с помощью:
*/1 * * * * php /var/www/html/cron/cron_job.php
И я вижу это в crontab -u root -l
, но задание не выполнено. Это также не работает, когда я запускаю команду непосредственно из командной строки следующим образом:
<?php /var/www/html/cron/cron_job.php
Я перепробовал много ответов, связанных с cron, но ничего не получалось. Например:
/usr/local/bin /var/www/html/cron/cron_job.php
/usr/local/bin/php /var/www/html/cron/cron_job.php
sudo php -f /var/www/html/cron/cron_job.php
Скрипт php тестирования (cron_job.php
) является:
php file_put_contents ('test.txt',"test content\n",FILE_APPEND);
С правами доступа к файлам все в порядке, и он работает при запуске в браузере или при открытии терминала в /var/www/html/cron/
и работает php cron_job.php
,
Как и просили в комментариях, если я добавлю 2> /tmp/php.log
в php /var/www/html/cron/cron_job.php
используйте скрипт с синтаксической ошибкой и попробуйте запустить (php /var/www/html/cron/cron_job.php 2> /tmp/php.log
) из терминала меню, то журнал ошибок получает сообщение об ошибке.
2 ответа
Ваш скрипт почти наверняка работает и создает ваш файл. Это просто не создает его там, где вы ожидаете. Вы не используете какой-либо путь в вашем скрипте, вы просто используете имя файла. Это означает, что файл будет создан в каталоге, в котором выполняется скрипт.
Вот почему, когда вы переходите в определенный каталог и запускаете там скрипт, вы думаете, что он работает. Поскольку файл создан в каталоге, в котором вы его запустили, вы можете его увидеть. По умолчанию, cron
работает в домашнем каталоге пользователя, запустившего его. Так как это crontab root (что, кстати, плохая идея), файл будет создан в /root
, Итак, проверь:
sudo ls /root/test.txt
Поэтому в следующий раз дайте вашему сценарию полный путь, а не просто имя файла:
<?php file_put_contents ('/path/to/test.txt',"test content\n",FILE_APPEND); ?>
Теперь файл будет создан в /path/to
,
По умолчанию задания Cron выполняются в домашнем каталоге пользователя. Пока в вашем скрипте не указан путь, по которому будет сохранен выходной файл, он будет сохранен в каталоге, где выполняется скрипт.
В вашем PHP скрипте путь к файлу test.txt
пропал, отсутствует. Вы можете установить его как абсолютное значение, как описано в ответе @ terdon, или указать относительный путь (с правильным происхождением). Например, если test.txt
должен находиться в том же каталоге, что и cron_job.php
содержимое вашего скрипта должно выглядеть примерно так:
<?php
$path = realpath(dirname(__FILE__));
file_put_contents ("$path/" . 'test.txt',"test content\n",FILE_APPEND);
?>
В качестве альтернативы, если вы не хотите менять скрипт, вы можете изменить задание Cron следующим образом:
*/1 * * * * cd /var/www/html/cron/ && php cron_job.php