Чтобы фоновые задачи Nextcloud запускались автоматически с помощью systemd, настройте одноразовую службу, работающую cron.phpот имени пользователя веб-сервера, а затем включите таймер, который будет запускать эту службу каждые пять минут. Ключевые проверки: таймер включен и имеет время следующего запуска, служба указывает на правильные пути Nextcloud и PHP, а в журнале службы отображается успешное завершение. Одноразовая служба может отображаться как «неактивная (завершенная)» между запусками; это может быть нормальным явлением после ее завершения.
Данная настройка предназначена для стандартной установки Nextcloud на Ubuntu с использованием systemd, при этом файлы Nextcloud доступны на хосте. Если Nextcloud работает внутри Docker, Snap или устройства, такого как Nextcloud All-in-One, используйте описанный в этом дистрибутиве метод планировщика вместо указания хост-модулю пути, доступного только для контейнера. В приведенных ниже примерах используются /var/www/nextcloudи www-data; замените их реальным путем установки и HTTP-пользователем на вашем сервере.
Что должен делать таймер?
В Nextcloud cron.phpфоновые задачи, такие как техническое обслуживание и задачи приложений, запускаются по очереди. Таймер systemd — это часы; служба — это команда, которая запускается по истечении таймера. Вам нужны оба. Создание файлов без включения таймера приводит к неактивности расписания, а включение таймера, указывающего на неправильный путь к PHP или Nextcloud, может привести к многократным сбоям при запуске.
Nextcloud рекомендует использовать системный cron для фоновых задач в производственной среде. В текущем руководстве администратора также описаны таймеры systemd в качестве альтернативы. Пример расписания запускается через пять минут после загрузки системы, а затем планируется еще один запуск через пять минут после каждой активации службы. Это позволяет избежать необходимости посещения пользователем веб-интерфейса.
1. Подтвердите путь установки, пользователя и PHP CLI.
Перед редактированием модулей найдите каталог Nextcloud и проверьте, какую команду PHP ожидает веб-сервер. В типичной установке архива Ubuntu путь может быть таким: `<путь к каталогу>`, /var/www/nextcloudвеб-пользователь часто — `< имя пользователя www-data>`, а PHP CLI — `<имя пользователя>` /usr/bin/php. Проверьте это, а не предполагайте:
ls -l /var/www/nextcloud/cron.php
command -v php
php -v
Если ваш каталог Nextcloud находится в другом месте, замените его в обеих командах юнита ниже. Если веб-сервер использует отдельную версию PHP, используйте исполняемый файл CLI этой версии в ExecStartи ExecCondition. Служба systemd не наследует переменную PATH или окружение интерактивной оболочки, поэтому явное указание путей более надежно.
Проверьте статус под тем же пользователем, которого будет использовать systemd:
sudo -u www-data /usr/bin/php -f /var/www/nextcloud/occ status -e
Команда Nextcloud occдолжна выполняться от имени пользователя HTTP, чтобы сохранить корректные права собственности и разрешения на файлы. Если в результате проверки будет обнаружена ошибка PHP, режим обслуживания или отсутствующий файл, сначала исправьте это; таймер не сможет компенсировать сбой команды Nextcloud.
2. Создайте одноразовую услугу.
Создавать /etc/systemd/system/nextcloudcron.service:
sudo nano /etc/systemd/system/nextcloudcron.service
Войдите в этот модуль, изменив путь и пользователя, если в вашей системе установлены другие параметры:
[Unit]
Description=Nextcloud cron.php job
[Service]
User=www-data
ExecCondition=/usr/bin/php -f /var/www/nextcloud/occ status -e
ExecStart=/usr/bin/php -f /var/www/nextcloud/cron.php
KillMode=process
ExecConditionПроверяет, работает ли Nextcloud в обычном режиме, прежде чем запускать фоновое задание. Если условие не выполняется, systemd пропускает запуск; проверьте журнал, чтобы узнать причину. Позволяет внешним программам, запущенным фоновым заданием, продолжать работу после завершения основного процесса cron. В текущем примере Nextcloud раздел в этом файле службы KillMode=processне требуется .[Install]
Использовать его /usr/bin/phpцелесообразно только в том случае, если это правильный интерпретатор командной строки на вашем сервере. Например, пользовательский репозиторий PHP может установить версионированный бинарный файл. Используйте ту же совместимую версию PHP, которая требуется Nextcloud и которая используется в конфигурации его веб-сервера.
3. Создайте таймер.
Создавать /etc/systemd/system/nextcloudcron.timer:
sudo nano /etc/systemd/system/nextcloudcron.timer
Добавлять:
[Unit]
Description=Run Nextcloud cron.php every 5 minutes
[Timer]
OnBootSec=5 min
OnUnitActiveSec=5 min
Unit=nextcloudcron.service
[Install]
WantedBy=timers.target
OnBootSecПланирует первый запуск через пять минут после запуска systemd при загрузке системы. OnUnitActiveSecПланирует еще один запуск через пять минут после последней активации службы. Таймер не совпадает со службой: включите и запустите модуль, .timerчтобы расписание выполнялось автоматически.
4. Перезагрузите systemd и включите таймер.
Попросите systemd прочитать новые файлы юнитов, затем включите и запустите таймер одной командой:
sudo systemctl daemon-reload
sudo systemctl enable --now nextcloudcron.timer
Проверьте таймер:
systemctl status nextcloudcron.timer
systemctl list-timers --all | grep nextcloudcron
Таймер должен быть загружен и активен, а list-timersв поле «Следующее» должно отображаться будущее время. Если он отключен, не загружен или не имеет следующей активации, убедитесь, что имя файла заканчивается на .timer, [Install]раздел содержит WantedBy=timers.target, и вы запустили команду daemon-reloadпосле сохранения файлов.
5. Проведите один тест и проверьте его результат.
Вы можете запустить службу один раз, не дожидаясь следующего срабатывания таймера:
sudo systemctl start nextcloudcron.service
sudo systemctl status nextcloudcron.service
sudo journalctl -u nextcloudcron.service -n 50 --no-pager
Проверьте результат работы сервиса и наличие ошибок PHP или Nextcloud. После завершения команды nextcloudcron.serviceможет произойти возврат к исходному состоянию inactive (dead), поскольку это одноразовая задача. Само по себе это не означает, что она завершилась с ошибкой. Таймер должен оставаться активным и планировать следующий запуск; в журнале должно отображаться, успешно ли завершился предыдущий запуск.
В настройках администрирования Nextcloud откройте раздел состояния фоновых заданий и убедитесь, что время последнего выполнения задания увеличивается после срабатывания таймера. Предупреждение в обзоре должно исчезнуть, когда Nextcloud обнаружит недавнюю фоновую активность. Подождите хотя бы один интервал после включения таймера, прежде чем принимать решение о том, что задание не было выполнено.
Диагностика распространенных причин отказов
| То, что вы видите | Что проверить | Следующий шаг |
| Таймер «неактивен» или отключен. | Была ли включена и запущена функция таймера. | Запустите sudo systemctl enable --now nextcloudcron.timer, затем проверьте.systemctl list-timers |
| Таймер активен, но служба не работает. | Журнал сервиса, исполняемый файл PHP, путь к Nextcloud и пользователь сервиса. | Запустите проверку состояния следующим образом www-data: исправьте первую обнаруженную ошибку PHP или ошибку доступа к файлам. |
| Сервис неактивен между запусками. | Следующее время таймера и последняя запись в журнале обслуживания. | Если служба завершила работу успешно, а таймер остается активным, это нормально для одноразового устройства. |
Служба завершает работу, не запустившись.cron.php | Результат ExecConditionи информация о том, находится ли Nextcloud в режиме технического обслуживания. | Устраните ошибку, возникшую в системе, и проверьте состояние Nextcloud, прежде чем снова запускать задание вручную. |
| На странице администрирования по-прежнему отображается сообщение о том, что cron не был запущен. | Проверяется, действительно ли служба вызывает правильный экземпляр и изменяется ли время его последнего выполнения. | Дождитесь истечения заданного интервала времени, изучите журналы и убедитесь, что проверяете одну и ту же установку Nextcloud. |
Для получения более подробной информации просмотрите последние журналы работы службы и файл журнала Nextcloud:
sudo journalctl -u nextcloudcron.service --since "30 minutes ago" --no-pager
sudo -u www-data /usr/bin/php -f /var/www/nextcloud/occ background-job:list
В списке заданий отображаются зарегистрированные задачи, но это само по себе не является доказательством того, что таймер выполняется. Используйте совместно время последнего и следующего срабатывания таймера, журнал служб и индикатор последнего запуска Nextcloud.
Когда следует использовать другой планировщик задач?
Таймеры Systemd хорошо работают, когда на сервере запущен Systemd, и вам нужно локальное расписание, управляемое службой. Если у вас уже используется стандартный демон cron и вы можете проверить его crontab, поддерживается также системная запись cron, которая вызывает тот же cron.phpметод www-data. Не планируйте оба метода для одного и того же экземпляра Nextcloud; перекрывающиеся вызовы могут привести к нерациональному расходованию ресурсов и усложнить поиск и устранение неисправностей.
Планирование AJAX-запросов зависит от количества пользователей, посещающих Nextcloud, и менее надежно для загруженного или многопользовательского сервера. Webcron выполняет запросы cron.phpпо HTTP и может подойти для очень небольшого экземпляра, где доступ к системе недоступен, но Nextcloud отмечает, что веб-выполнение ограничивает объем работы, который может быть выполнен за один вызов. Если Nextcloud контейнеризирован или управляется устройством, используйте поддерживаемый им планировщик или конфигурацию контейнера; служба хоста, использующая /var/www/nextcloudэтот путь, не будет работать, если он отсутствует на хосте.
В исправной конфигурации таймер включен с повторяющимся временем NEXT, запуски служб завершаются без ошибок PHP, а время последнего запуска Nextcloud сдвигается вперед. Если все три условия выполняются, но конкретная задача приложения все еще отображается с задержкой, возможно, планировщик работает, пока эта задача ожидает выполнения своего собственного расписания, окна технического обслуживания или условий очереди. Прежде чем изменять интервал таймера, проведите диагностику этой задачи отдельно.
Официальные ссылки