Назад | Перейти на главную страницу

Как PHP настроить задание crontab, которое работает как www-данные?

Мой сервер работает на Ubuntu 14.04 и nginx. Моя проблема касается Cron, Я бы хотел запустить его (crontab) с помощью файла - cron.txt, его содержимое:

* * * * * /usr/bin/php /var/www/html/test.php >> /var/log/cron.log

Если я запустил его с помощью команды: crontab /var/www/html/cron.txt, работает отлично, скрипт test.php выполняется. Но когда я делаю то же самое с помощью PHP-скрипта (выполняемого через браузер): exec('crontab /var/www/html/cron.txt');, это не работает.

Проверка текущего cronjob командой: crontab -l -u www-data, строка из файла появляется, но Cron не выполняет свою работу. Может это связано с какими-то проблемами с разрешениями? Потому что он работает только от имени пользователя root. Есть ли способ заставить Cron выполнять задачи www-data?

Я не совсем понимаю, чего вы пытаетесь достичь. Насколько я понимаю, вам нужно выполнить задание cron как www-data пользователь. Обычно (настоятельно рекомендуется) пользователь www-data не имеет доступа к оболочке. Но вы можете выполнять задачи cron как www-данные, помещая свои задачи в корневой cron следующим образом:

* * * * * su www-data -s /bin/bash -c "/usr/bin/php /YOUR_PATH/task.php"

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

Вы можете изменить параметры * * * *, чтобы скорректировать расписание вашей работы. В моем примере он запускается каждую минуту.

Надеюсь, поможет.

Вы хотите чего-то странного. Почему вы запускаете crontab из php скрипта? Crontab - это планировщик заданий, основанный на времени, он не должен запускаться из скрипта php. Если вы хотите запустить cronjob как www-данные, вам нужно настроить его командой crontab -u www-data -e и после этого ваша работа будет выполняться так, как вы ее настроили.

Мне удалось добиться того, что я хотел, все в коде в моем первоначальном сообщении в порядке, единственное, что я должен был знать, это то, что пользователю www-data не разрешено писать в /var/log, поэтому у меня не было выхода. Кроме того, в моем PHP-скрипте я пытался создать файл и что-то в него записать, для этого требуется абсолютный путь, поэтому он должен выглядеть так:

dirname(__FILE__) . '/myfile.txt';

После этих изменений все работает как положено.

Nextcloud нужно то же самое. Похоже, они не могут заставить PHP настроить задание Cron в своем установщике и настаивают на том, чтобы это сделал администратор Linux.

Итак, для вашего первого вопроса. Как мне использовать PHP для настройки задания crontab www-data? О: Нет, это должно быть сделано в Shell.

Что касается вашего второго вопроса: Может ли crontab запустить задание www-data? О: Полностью, но эта часть выполняется во время настройки задания crontab. С помощью www-data выполнять задание cron из любого файла cron - плохая идея, просто позвольте www-data запустить само задание crontab.

Вот как я заставил это работать:

  1. Вероятно, ваша строка должна быть:

* * * * *php -f/var/www/html/test.php >> /var/log/cron.log

  1. www-data привередлив как пользователь Cron.

В терминале настройте Cron следующим образом:

Работает как root...

crontab -u www-data -e ... добавьте строку для запуска, как в вашем Q.

... Но, похоже, вы хотите использовать PHP для настройки задания crontab. (Я предполагаю, что это установщик PHP.) Возможно, приложение PHP не сможет настроить задание crontab. Возможно, это даже не лучшая идея. Если вы можете это сделать, обязательно сообщите об этом разработчикам Nextcloud, потому что они, похоже, тоже не знают, как это сделать.