#Как распознать проблему и где применимы действия
Служба перестала читать данные или запускаться после ручной смены прав каталога. Сначала установите, какое конкретно право исчезло, и восстановите только его. Перед выполнением определите название программы, редакцию Linux и управляющий сервис. Значения примеров в командах не являются готовой конфигурацией вашего устройства.
#Возможные причины и диагностические признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Недоступен проход по родительскому каталогу | namei показывает каталог без x для владельца службы | Вернуть необходимое право прохода адресно |
| Сменился владелец данных | systemd запускает User=app, а файлы принадлежат другому владельцу | Сравнить с резервной копией и вернуть владельца отдельных файлов |
| Действует MAC-защита или sandbox | Unix-права достаточны, но журнал сообщает denied | Проверить SELinux/AppArmor/ProtectHome без отключения защиты |
#Пошаговая диагностика и исправление
- Шаг 1. Проверьте, от кого запускается сервисВыпишите User, Group, DynamicUser, StateDirectory и WorkingDirectory. При DynamicUser статический chown на случайный UID не нужен и способен ухудшить работу.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)КомандаТерминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
UNIT='имя.service'; systemctl show "$UNIT" -p User -p Group -p DynamicUser -p StateDirectory -p WorkingDirectory
- Шаг 2. Найдите путь отказаПроверьте сообщения журнала именно после изменения прав. Сообщения EACCES, Permission denied и CHDIR требуют проверки соответствующего файла или каталога, а не всей файловой системы.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)КомандаТерминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
UNIT='имя.service'; journalctl -b -u "$UNIT" -n 80 --no-pager
- Шаг 3. Покажите владельцев и права по всему путиПодставьте фактический путь ошибки. namei -l помогает обнаружить родительский каталог, у которого не хватает x. Не используйте chmod -R 777.Linux · Терминал (Bash)КомандаТерминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
namei -l /srv/приложение/data/config.jsonstat -c '%a %U:%G %n' /srv/приложение/data
- Шаг 4. Проверьте, что может делать пользователь сервисаЗапустите только безопасные test -r и test -x от User= службы. Примерный путь замените. Для записи используйте test -w, но не создавайте файлов в рабочей базе без необходимости. Команды sudo или sudoedit выполняются с полномочиями администратора; если sudo не установлен, используйте разрешённую административную сессию.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)КомандаНужен sudoТерминал Linux на сервере/клиенте, указанном в шаге. Нужны права администратора; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
sudo -u имя_пользователя test -r /srv/приложение/data/config.json && echo 'чтение доступно'
- Шаг 5. Сравните права с сохранённым эталономЕсли сохранился список прав из резервной копии или пакета, определите точное прежнее значение. При ACL отдельно посмотрите getfacl при наличии утилиты; chmod может скрыть или изменить ACL-маску.Linux · Терминал (Bash)КомандаТерминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
getfacl -p /srv/приложение/data 2>/dev/null || echo 'getfacl не установлен или нет доступа'
- Шаг 6. Верните только необходимый доступИсправьте владельца/группу адресно после согласования с владельцем приложения; затем перезапустите только одну службу. Приведённая команда не меняет права автоматически, чтобы не стереть действующие ACL. Команды sudo или sudoedit выполняются с полномочиями администратора; если sudo не установлен, используйте разрешённую административную сессию.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)С осторожностьюНужен sudoТерминал Linux на сервере/клиенте, указанном в шаге. Нужны права администратора; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
UNIT='имя.service'; sudo systemctl restart "$UNIT"systemctl status "$UNIT" --no-pagerКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как проверить, что проблема действительно устранена
Сервис должен выполнять исходную операцию с конкретным файлом. Если Unix-права нормальны, проверьте защитные профили и монтирование без глобального выключения механизмов безопасности.
#Если результат не получен
Вернитесь к самому раннему отличающемуся результату диагностики и проверьте точный текст ошибки, текущую загрузку и фактическую версию программы. Не повторяйте опасную команду с другими правами наугад. Если это рабочий сервер, передайте администратору обезличенные отрывки журнала за момент сбоя и уже выполненные действия.