#Когда возникает проблема и к каким системам относится
Служба запускается от root, но завершается ошибкой при переходе на отдельного пользователя. Нельзя решать это отключением SELinux или chmod 777 на всё приложение. Rocky Linux с системной службой systemd и User=; используйте отдельную системную учётную запись с наименьшими правами.
#Основные причины: как отличить одну от другой
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Нет доступа к файламДанные или каталоги принадлежат root | namei, журнал содержат Permission denied | Точечно назначить владельца рабочих каталогов |
| Недостаточны привилегии порта/устройстваПроцесс требует privileged port или системный сокет | В журнале bind: permission denied | Использовать socket activation/capabilities при подтверждённой нужде |
| Неподходящая домашняя/рабочая папкаUser= задан, но WorkingDirectory закрыт | status=200/CHDIR или 217/USER | Исправить unit и существование учётной записи |
#Пошаговая диагностика и устранение неисправности
- Шаг 1. Сравните рабочую и нерабочую конфигурацииВ терминале администратора найдите имя unit. Перед изменениями сохраните вывод systemctl cat. Не редактируйте файлы из /usr/lib/systemd/system напрямую: обновления RPM их заменят.
- Терминал Rocky Linux; административные права не обязательныLinux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
UNIT="имя.service"systemctl cat "$UNIT"systemctl show "$UNIT" -p User -p Group -p WorkingDirectory -p ExecStart
- Шаг 2. Проверьте, существует ли назначенный пользовательИмя пользователя перепишите из User=. getent должен вернуть запись с UID, GID и домашним каталогом. Если не возвращает — сначала восстановите учётную запись по инструкциям поставщика приложения, не создавая её произвольным UID.Linux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
getent passwd имя_пользователяid имя_пользователя
- Шаг 3. Проверьте журнал именно после попытки запускаОсобенно важны коды 217/USER, 200/CHDIR, Permission denied и Cannot bind. От этих признаков зависит следующий шаг. Для удобства временно воспроизведите сбой в разрешённое окно, чтобы видеть новые сообщения.
- Терминал Rocky Linux; административные права не обязательныLinux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
UNIT="имя.service"systemctl status "$UNIT" --no-pagerjournalctl -b -u "$UNIT" --no-pager -n 100
- Шаг 4. Проверьте доступ к рабочему каталогу и исполняемому файлуУзнайте путь из WorkingDirectory и ExecStart, затем проверьте права всех промежуточных папок через namei -l. Если исполняемая программа в /usr/bin, не меняйте её владельца ради отдельного пользователя.
- Терминал Rocky Linux; административные права не обязательныLinux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
WORK="/srv/приложение"namei -l "$WORK"ls -ldZ "$WORK"
- Шаг 5. Если обычные права подходят, проверьте SELinuxВ Rocky Linux SELinux часто работает в Enforcing. Найдите именно связанный по времени AVC, прежде чем менять метку. restorecon -n показывает предполагаемые исправления и не изменяет файлов. Не используйте setenforce 0 для постоянного решения.
- Терминал Rocky Linux; нужны административные праваLinux · Терминал (Bash)КомандаНужен sudoТерминал Rocky Linux; нужны административные права. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
getenforcecommand -v ausearch && sudo ausearch -m AVC,USER_AVC -ts recent | tail -40 || truesudo restorecon -n -v /srv/приложение
- Шаг 6. Определите минимум изменений в systemdДля каталога состояния предпочтите RuntimeDirectory, StateDirectory или LogsDirectory: systemd может создавать их с согласованным владельцем. Введите фактическое имя unit и откройте drop-in; не используйте глобальный запуск как root для обхода ошибки.
- Терминал Rocky Linux; нужны административные праваLinux · Терминал (Bash)С осторожностьюНужен sudoТерминал Rocky Linux; нужны административные права. Меняет настройки/состояние службы: сначала копия и возможность отката.
sudo systemctl edit имя.serviceКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- Шаг 7. Перезапустите только проверенную службуПеред перезапуском обеспечьте возможность восстановления и при необходимости сохраните прежнюю конфигурацию. Проверьте, что после старта PID использует нужного пользователя и выполняет прикладную задачу, а не просто остаётся active.
- Терминал Rocky Linux; нужны административные праваLinux · Терминал (Bash)С осторожностьюНужен sudoТерминал Rocky Linux; нужны административные права. Меняет настройки/состояние службы: сначала копия и возможность отката.
sudo systemctl daemon-reloadsudo systemctl restart имя.servicesystemctl status имя.service --no-pagerps -eo user,pid,comm | grep имя_процессаКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как убедиться, что неисправность устранена
Служба работает от требуемой учётной записи, отвечает на штатный запрос и не выдаёт новые отказы файловых прав или SELinux; права root не нужны.
#Если предложенный способ не сработал
Если код 217/USER или 200/CHDIR остаётся, проверьте конкретную запись пользователя и путь, отмените неработающий drop-in и соберите журнал. Для портов <1024 используйте отдельный разбор capabilities или socket activation.