Вопрос или проблема
Мой сервер работает на 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');
, это не работает.
Проверяя текущие задания cron с помощью команды: crontab -l -u www-data
, строка из файла появляется, но Cron не выполняет работу. Может быть, это связано с какими-то проблемами разрешений? Потому что это работает только при выполнении от имени root. Есть ли способ заставить Cron выполнять задачи от имени www-data тоже?
Я не совсем понимаю, что вы пытаетесь достичь. Насколько я понимаю, вам нужно выполнять cron-задания от пользователя www-data. Обычно (и настоятельно рекомендуется) пользователь www-data не имеет доступа к оболочке. Но вы можете выполнять задания cron от имени www-data, разместив ваши задачи в кроне root следующим образом:
* * * * * su www-data -s /bin/bash -c "/usr/bin/php /YOUR_PATH/task.php"
Это также чистый способ, так как у вас все задания cron системы централизованы в одном файле, но каждое задание выполняется от нужного пользователя (с правильными разрешениями и атрибутами).
Вы можете изменить параметры * * * * * чтобы настроить расписание вашего задания. В моем примере оно запускается каждую минуту.
Надеюсь, это поможет.
Вы хотите что-то странное. Почему вы запускаете crontab из php-скрипта? Crontab — это планировщик заданий, основанный на времени, он не должен запускаться из php-скрипта. Если вы хотите запустить cronjob как www-data, вы должны настроить его с помощью команды 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 самостоятельно.
Вот как я это сделал:
- Ваша строка, вероятно, должна быть такой:
* * * * *
php -f
/var/www/html/test.php >> /var/log/cron.log
www-data
привередлив как пользователь Cron.
Из терминала настройте Cron таким образом:
Запуск от имени root
…
crontab -u www-data -e
…добавьте строку для выполнения, похожую на вашу в вопросе.
…Но, похоже, вы хотите использовать PHP для настройки задания crontab. (Я предполагаю, это PHP-установщик.) Если у вас получится это сделать, обязательно сообщите об этом разработчикам Nextcloud, потому что они, похоже, не знают, как это сделать.
Ответ или решение
Настройка cron-задания для выполнения от имени пользователя www-data
может быть вызвана несколькими причинами, такими как безопасность или необходимость выполнения задач с определенными правами доступа. Понимание того, как правильно организовать выполнение cron-задания, и учёт специфики среды, в которой оно выполняется, критично.
Теория
Cron — это служба для планирования задач, которая автоматизирует выполнение скриптов или программ через заданные интервалы времени. На системах на базе Unix/Linux, cron предоставляет возможность пользователям планировать запуск их скриптов или программ на регулярной основе.
Пользователь www-data
обычно используется веб-серверами, такими как Apache или nginx, и его права минимально необходимы для выполнения задач, связанных с обслуживанием веб-контента. Это повышает безопасность системы, ограничивая потенциальный ущерб, который может быть нанесен в случае взлома.
Пример
Вы хотите настроить cron-задание, исполняющее PHP-скрипт test.php
каждую минуту и записывающее результат в лог-файл cron.log
. У вас возникли затруднения, так как cron-задание не выполняется, если оно настроено через PHP скрипт, несмотря на то, что при явной установке через терминал оно работает.
Основная проблема — это права доступа и соответствие контекста выполнения задач. Пользователь www-data
может не иметь необходимых прав на запись в некоторые директории, например, /var/log
, что может привести к сбоям. Кроме того, вы пытались установить cron-задание через PHP, что неверно, так как PHP не предназначен для управления системными задачами cron.
Применение
-
Права доступа: Убедитесь, что пользователь
www-data
имеет необходимые права на выполнение всех операций, предусмотренных вашим скриптомtest.php
. Это включает права на запись в файл. Ознакомьтесь с файловыми разрешениями, используя командыchown
иchmod
, чтобы убедиться в необходимых правах доступа. -
Установка cron-задания: Наилучший подход — вручную настроить cron через терминал от имени пользователя
www-data
. Используйте команду:sudo crontab -u www-data -e
Это откроет редактор для редактирования crontab файла пользователя
www-data
. Введите вашу строку задания и сохраните изменения. Это гарантирует, что задание cron работает под теми же условиями, как если бы оно было установлено от имениwww-data
. -
Пути и логирование: Избегайте записи логов в каталоги, такие как
/var/log
, без подходящих прав. Вместо этого создайте каталог в доступном месте специально для ваших задач (например, внутри/var/www/html/logs
), и убедитесь, чтоwww-data
имеет туда доступ. Проверьте абсолютные пути в вашем PHP-скрипте, чтобы избежать ошибок, связанных с выполнением cron. -
Отладка: Для проверки и отладки cron-заданий используйте:
sudo grep CRON /var/log/syslog
Это позволяет просматривать все события, связанные с cron, и выявлять любые ошибки в скриптах или заданиях.
-
Безопасность: Убедитесь, что скрипт
test.php
безопасен для выполнения от имениwww-data
, не предоставляя потенциально опасным кодам или пользователям возможность эксплуатировать возможности cron.
Таким образом, настройка cron-задания для выполнения от имени www-data
требует точечного управления правами доступа и корректной установки через терминал, что обеспечивает его надежное выполнение в нужном вам контексте.