Фоновые задания веб-приложения не выполняются
Веб-приложения на PHP выносят фоновые задания в отдельный запуск интерпретатора. Задание должно работать от пользователя веб-сервера, иначе созданные файлы окажутся недоступны приложению. Это самая частая причина того, что задания вроде бы идут, а результата нет.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Задание работает от неверного пользователя
Файлы, созданные от root, недоступны веб-серверу. Приложение потом не может их прочитать или переписать.
-
Используется не тот интерпретатор
Веб-сервер и командная строка могут использовать разные сборки интерпретатора с разными настройками и расширениями.
-
Таймер не включён
Unit-файл задачи есть, таймера нет или он не включён. Задача не запускается никогда, а её состояние выглядит нормальным.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Включён ли таймер и когда сработает.
systemctl list-timers "nextcloud*" --all --no-pagerЧто делало задание при последних запусках.
journalctl -u nextcloud-cron.service -n 30 --no-pagerПрогон задания от нужного пользователя вручную.
sudo -u www-data php -f /var/www/nextcloud/cron.php 2>&1 | headРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Файлы, созданные от root, недоступны веб-серверу. Приложение потом не может их прочитать или переписать.
- Как проверить
-
Посмотрите пользователя задания и владельца файлов приложения.
systemctl show nextcloud-cron.service -p User 2>/dev/null sudo ls -ld /var/www/nextcloud/data 2>/dev/null
- Как исправить
-
Задайте пользователя веб-сервера в unit-файле задания. Права на созданные файлы после этого будут верными.
[Service] Type=oneshot User=www-data ExecStart=/usr/bin/php -f /var/www/nextcloud/cron.php
- Почему происходит
- Веб-сервер и командная строка могут использовать разные сборки интерпретатора с разными настройками и расширениями.
- Как проверить
-
Сравните версии и настройки.
php -v | head -2; php -i 2>/dev/null | grep -E "^Loaded Configuration"
- Как исправить
- Укажите нужный исполняемый файл интерпретатора в команде запуска явно и проверьте, что расширения приложения ему доступны.
- Почему происходит
- Unit-файл задачи есть, таймера нет или он не включён. Задача не запускается никогда, а её состояние выглядит нормальным.
- Как проверить
-
Посмотрите таймер и время срабатываний.
systemctl list-timers "nextcloud*" --all --no-pager systemctl is-enabled nextcloud-cron.timer 2>/dev/null
- Как исправить
-
Включите таймер и проверьте время следующего срабатывания. Включать надо таймер, а не саму задачу.
sudo systemctl enable --now nextcloud-cron.timer
Пример вывода
Задание работает от root, файлы недоступны приложению. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
systemd[1]: Starting nextcloud-cron.service - Nextcloud background jobs...
php[6400]: PHP Warning: file_put_contents(/var/www/nextcloud/data/appdata/cache.tmp): Failed to open stream: Permission denied
systemd[1]: nextcloud-cron.service: Deactivated successfully.
Связанные ошибки
- Таймер не работает после перезагрузки Таймер работал, пока его запускали вручную, но после перезагрузки не активен: не выполнено включение или нет WantedBy=timers.target.
- php-fpm: Allowed memory size exhausted Скрипт исчерпал предел памяти PHP: ошибка 500, оборванные запросы. Где менять предел и когда он спасает.
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- Apache: конфликт модулей многопроцессности и PHP Apache не запускается после включения модуля PHP: несовместимость с выбранным модулем многопроцессности.
- AppArmor: apparmor="DENIED" в журнале ядра Профиль AppArmor запретил операцию: как прочитать запись, найти профиль и поправить его правильно.
- Caddy не занимает порты 80 и 443 без прав Служба падает при открытии слушателя: нет возможности занимать привилегированные порты.
- Configuration file is marked executable Предупреждение о правах: unit-файл помечен исполняемым. Откуда берётся и почему это стоит исправить.
- Configuration file is marked world-inaccessible Предупреждение о правах на unit-файл: служба работает, но файл недоступен для чтения другим.
Где встречается чаще всего
Источники
-
systemd.timer(5)
Включение таймера и время срабатываний. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено задачей от root при веб-сервере под другим пользователем.