Path-unit создаёт каталог с неверными правами
Unit наблюдения за путём может создать каталог сам. Права на него берутся из параметра режима, и по умолчанию они могут не подойти службе, которая должна складывать туда файлы.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Режим каталога не задан
Каталог создаётся с правами по умолчанию и владельцем root. Служба от другого пользователя писать в него не сможет.
-
Каталог нужен и службе, и внешним клиентам
Если файлы складывает другой пользователь, нужна общая группа: права только для владельца не подойдут.
-
Наблюдатель следит за каталогом, которого нет
Без создания каталога наблюдение не работает вовсе: события не приходят.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Настройки наблюдателя.
systemctl show myapp.path -p Paths -p MakeDirectory -p DirectoryModeПрава и владелец каталога наблюдения.
ls -ld /var/spool/myappРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Каталог создаётся с правами по умолчанию и владельцем root. Служба от другого пользователя писать в него не сможет.
- Как проверить
-
Посмотрите права и параметр.
ls -ld /var/spool/myapp systemctl show myapp.path -p DirectoryMode
- Как исправить
- Задайте режим в описании наблюдателя. Владельца при необходимости выставьте описанием файлов через механизм tmpfiles.
- Почему происходит
- Если файлы складывает другой пользователь, нужна общая группа: права только для владельца не подойдут.
- Как проверить
-
Посмотрите, кто пишет в каталог.
ls -l /var/spool/myapp | head systemctl show myapp.service -p User
- Как исправить
- Создайте каталог через описание файлов с нужной группой и правами, а наблюдатель настройте только на слежение.
- Почему происходит
- Без создания каталога наблюдение не работает вовсе: события не приходят.
- Как проверить
-
Посмотрите параметр создания и наличие каталога.
systemctl show myapp.path -p MakeDirectory -p Paths
- Как исправить
- Либо включите создание каталога, либо создайте его заранее описанием файлов.
Пример вывода
Каталог создан с правами, недоступными службе. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ systemctl show myapp.path -p MakeDirectory -p DirectoryMode
MakeDirectory=yes
DirectoryMode=0755
$ ls -ld /var/spool/myapp
drwxr-xr-x 2 root root 4096 Sep 15 16:02 /var/spool/myapp
app@client[4100]: error: open /var/spool/myapp/job1: permission denied
Связанные ошибки
- Path-unit не реагирует на изменения Unit .path не запускает службу при появлении или изменении файла. Разбор: не включён, следит не за тем, служба уже активна.
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- status=233/RUNTIME_DIRECTORY в systemd Код 233/RUNTIME_DIRECTORY: не удалось подготовить каталог службы в /run из RuntimeDirectory=. Права, режим, удаление при остановке.
- AppArmor: apparmor="DENIED" в журнале ядра Профиль AppArmor запретил операцию: как прочитать запись, найти профиль и поправить его правильно.
- Caddy не занимает порты 80 и 443 без прав Служба падает при открытии слушателя: нет возможности занимать привилегированные порты.
- Configuration file is marked executable Предупреждение о правах: unit-файл помечен исполняемым. Откуда берётся и почему это стоит исправить.
- Configuration file is marked world-inaccessible Предупреждение о правах на unit-файл: служба работает, но файл недоступен для чтения другим.
- Interactive authentication required при управлении службой systemctl требует аутентификации: обращение от непривилегированного пользователя через polkit. Как разрешить точечно.
Источники
-
systemd.path(5)
MakeDirectory= и DirectoryMode=. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено наблюдателем, создающим каталог с правами 0755 от root.