#Когда возникает ошибка в Debian и какие условия важны
У пользовательской службы systemd в Debian в журнале появляются Permission denied или Access denied. Это не то же самое, что сбой системной службы с User=. Проверять нужно пользователя, его домашний каталог, доступ к конкретному файлу и ограничения unit.
#Причины и как отличить их друг от друга
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Файл принадлежит другому пользователю | stat показывает владельца root, а unit запущен от обычной учётной записи. | Разрешить доступ только к нужному файлу или каталогу. |
| Недоступен один из родительских каталогов | Файл имеет право чтения, но по пути отсутствует право прохода x. | Проверить namei -l и цепочку родительских каталогов. |
| Служба защищена настройками sandbox | ReadOnlyPaths либо ProtectHome запрещает путь, хотя права Unix верны. | Прочитать ограничения unit и применить адресное переопределение. |
#Пошаговая диагностика и устранение
- 1. Проверьте, что речь о пользовательском менеджереОткройте терминал именно той учётной записи, которая должна запускать программу. Команда systemctl --user обращается к её сеансу; через sudo в root легко проверить совершенно иной менеджер и получить ложную картину. Сначала найдите unit, его статус и фактический процесс.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
idsystemctl --user list-unit-files --type=service --no-pagersystemctl --user status ИМЯ.service --no-pager
- 2. Выделите из журнала настоящий путь отказаИспользуйте journalctl --user и фильтр -u, чтобы найти операцию и полный путь после Permission denied. Если журнал пуст, сначала проверьте правильность имени и пользователя; ошибку из другой службы не переносите на вашу. Запишите код и время, не копируя содержимое секретных файлов.Linux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
journalctl --user -u ИМЯ.service -b --no-pager -n 100
- 3. Сопоставьте владельца и каждый каталог в путиВместо /ПУТЬ/К/ФАЙЛУ введите точный путь из сообщения. namei -l показывает права на промежуточных каталогах; ls -l только конечного файла этого не отражает. Если папка принадлежит root и закрыта, не меняйте права всего дерева рекурсивно.Linux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
namei -l /ПУТЬ/К/ФАЙЛУstat /ПУТЬ/К/ФАЙЛУ
- 4. Проверьте специальные ограничения службыВыведите unit и свойства, влияющие на доступ к домашнему каталогу и файловой системе. Если ProtectHome=true или ReadWritePaths задаёт иной путь, обычный chmod не исправит проблему; нужен пересмотр доступа по документации systemd. Изменяйте только собственный unit через edit.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
systemctl --user cat ИМЯ.servicesystemctl --user show ИМЯ.service -p ProtectHome -p ProtectSystem -p ReadWritePaths
- 5. Выберите минимальное изменение правДля личного каталога службы предпочтительнее перенести данные в место, где пользователь действительно должен работать, или исправить владельца одного нужного файла после резервной копии. Не используйте chmod 777 или chown -R для /home и /var. Для системной директории потребуется согласование администратора.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
stat -c "%U %G %a %n" /ПУТЬ/К/ФАЙЛУ
- 6. Перезапустите только пострадавшую пользовательскую службуКогда вы точно исправили имя пути либо права одного объекта, выполните --user restart именно вашей службы. Эта команда меняет состояние процесса и может прервать выполняющуюся работу, поэтому предварительно сохраните данные приложения. Если unit сразу падает снова, не повторяйте restart циклом.
- Запуск не требует sudo, если это ваш пользовательский unitLinux · Терминал (Bash)С осторожностьюЗапуск не требует sudo, если это ваш пользовательский unit.
systemctl --user restart ИМЯ.servicesystemctl --user status ИМЯ.service --no-pagerКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 7. Проверяйте доступ не только по состоянию activeЗапустите безопасную функцию программы, использующую исходный файл, и повторно прочитайте journalctl. Если сообщение Permission denied исчезло, но появился другой отказ, исследуйте его отдельно. Не публикуйте полный журнал, пока не исключены пароли и личные данные.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
journalctl --user -u ИМЯ.service -b --no-pager -n 45
#Проверка результата и действия при неуспехе
Ошибка устранена только тогда, когда служба читает или создаёт необходимый объект от правильного пользователя и не требует небезопасных разрешений всему дереву.