Если на странице администратора ownCloud отображается сообщение о том, что фоновые задачи не выполняются, очистка по очереди и другие запланированные задачи могут выполняться с задержкой до тех пор, пока кто-нибудь не посетит сайт. На сервере Linux, управляемом systemd, настройте режим фоновых задач ownCloud для Cron и используйте таймер для запуска occ system:cronот имени учетной записи веб-сервера. В текущей документации ownCloud Server рекомендуется использовать системный cron для регулярной фоновой работы, и в частности, отмечаются таймеры systemd как еще один способ планирования команд.
Данное руководство предназначено для ownCloud Server Classic, установленного непосредственно на хосте Linux. Оно не применимо к ownCloud Infinite Scale, который имеет другую архитектуру, или к официальному образу ownCloud Docker, который уже использует cron внутри. Для Docker следуйте описанным в образе настройкам, вместо создания второго таймера на хосте. См. текущую документацию по фоновым заданиям ownCloud Server .
Перед изменением расписания проверьте команду.
Служба systemd определяет команду для выполнения; таймер периодически запускает эту службу. Сначала подтвердите путь установки ownCloud и учетную запись HTTP-сервера. В приведенных ниже примерах используются /var/www/owncloudи www-data, распространенные в Debian и Ubuntu. В других дистрибутивах Linux могут использоваться wwwrun, apache, или другая учетная запись.
Чтобы отличить неработающую команду от неработающего расписания, выполните команду ownCloud вручную от имени этой учетной записи:
sudo -u www-data /usr/bin/php -f /var/www/owncloud/occ system:cron
Измените путь к исполняемому файлу PHP occв соответствии с вашим сервером. ownCloud рекомендует использовать system:cronдля фоновых задач; старые руководства по планированию cron.phpмогут ссылаться на устаревшее поведение. Текущая команда может завершиться без вывода сообщения об успехе, поэтому echo $?сразу после этого проверьте ее статус завершения с помощью команды: 0означает, что команда завершилась успешно. Если возвращается ошибка, сначала исправьте путь, установку PHP CLI, права доступа, подключение к базе данных или ошибку ownCloud. Таймер будет многократно запускать одну и ту же команду, которая завершилась с ошибкой, если вы пропустите эту проверку.
Переведите ownCloud в режим Cron.
В настройках администратора ownCloud откройте раздел «Фоновые задания» или «Cron» и выберите «Cron» . Вы также можете настроить планировщик из каталога установки с помощью следующей команды:
cd /var/www/owncloud
sudo -E -u www-data php occ background:cron
Это включает режим Cron; запланированная команда остается неизменной occ system:cron. В руководстве ownCloud указано, что эта команда эквивалентна выбору Cron на странице администратора. Cron предпочтительнее для сервера, которому необходимо надежно обрабатывать задания, поскольку AJAX зависит от посещений страниц и может приводить к ожиданию выполнения задач в периоды низкой активности. Для небольшого личного экземпляра AJAX может быть проще, но он менее предсказуем.
Создайте службу systemd и таймер.
Создайте учетную запись, /etc/systemd/system/owncloudcron.serviceиспользуя свой реальный HTTP-аккаунт и путь к ownCloud:
[Unit]
Description=ownCloud background jobs
[Service]
Type=oneshot
User=www-data
WorkingDirectory=/var/www/owncloud
ExecStart=/usr/bin/php -f /var/www/owncloud/occ system:cron
Type=oneshotСообщает systemd, что команда выполнена до конца, а затем завершает работу. Указание полного пути к PHP позволяет избежать зависимости от ограниченных возможностей, PATHдоступных системным службам. Рабочий каталог помогает ownCloud разрешать относительные пути. Убедитесь, что учетная запись службы соответствует владельцу файлов ownCloud и доступа к данным. Не запускайте задание от имени root.
Далее создайте /etc/systemd/system/owncloudcron.timer:
[Unit]
Description=Run ownCloud background jobs every 15 minutes
[Timer]
OnBootSec=5min
OnUnitActiveSec=15min
Unit=owncloudcron.service
[Install]
WantedBy=timers.target
В руководстве ownCloud рекомендуется 15-минутный интервал для стандартного примера cron, а в качестве альтернативного планировщика признаются таймеры systemd. Этот таймер запускается через пять минут после загрузки системы, а затем планирует дальнейшие запуски через 15 минут после активации службы. Если для вашей рабочей нагрузки требуется другой интервал, измените его OnUnitActiveSecобдуманно и учтите время, необходимое для завершения каждого запуска. Избегайте настройки еще одной записи в crontab для той же команды; дублирующие планировщики могут запускать избыточные запуски и затруднять поиск и устранение неисправностей.
Дайте systemd команду перезагрузить определения юнитов, затем включите и запустите таймер:
sudo systemctl daemon-reload
sudo systemctl enable --now owncloudcron.timer
daemon-reloadЭто необходимо после создания или редактирования файлов юнитов. Включение таймера приводит к его автоматическому запуску после последующих загрузок; --nowон запускает его в текущей сессии. Включайте юнит таймера, а не только службу.
Выясните, почему запуск был пропущен или не удался.
Проверьте, включен ли таймер и когда он запустится в следующий раз:
systemctl is-enabled owncloudcron.timer
systemctl list-timers --all owncloudcron.timer
systemctl status owncloudcron.timer
В списке таймеров должен отображаться включенный таймер с датой следующего включения. Если этого не происходит, подтвердите имя файла юнита, перезагрузите systemd и снова включите таймер. Если таймер показывает запуск, но работа ownCloud по-прежнему задерживается, проверьте службу и ее журналы:
systemctl status owncloudcron.service
sudo journalctl -u owncloudcron.service --since today
Проверьте наличие неправильного пути, недоступного каталога данных, отсутствующего расширения PHP или ошибки базы данных. Проверьте вручную точную команду в файле службы, чтобы www-dataмаксимально точно воспроизвести ситуацию. Также убедитесь, что вы использовали команду ownCloud occ system:cron, а не скопировали пример Nextcloud, который вызывает cron.php.
Убедитесь, что ownCloud обрабатывает задания.
После одного или двух интервалов таймера убедитесь, что служба успешно завершилась и запланирована последующая активация таймера. Затем проверьте статус фоновых заданий на странице администратора ownCloud. Отображаемое время последнего запуска должно увеличиться, а предупреждение Cron должно исчезнуть. Если systemd сообщает об успехе, но предупреждение остается, проверьте журнал приложений ownCloud и убедитесь, что веб-интерфейс подключен к тому же экземпляру и базе данных, которые используются при установке из командной строки.
Для официальных контейнеров ownCloud не устанавливайте эти хост-модули, если вы намеренно не отключили внутренний планировщик контейнера и текущая документация ownCloud по контейнерам не поддерживает вашу конфигурацию. Приведенная здесь конфигурация представляет собой решение на уровне хоста для классического ownCloud на systemd; имена служб, пути, версии PHP и поведение контейнера зависят от развертывания.