#Когда возникает проблема и к каким системам относится
Путь приложения изменился, но unit, каталоги состояния и метки SELinux могли остаться прежними. Нужно найти конкретный старый путь и исправить его, не отключая механизмы безопасности. Rocky Linux с systemd: после переноса рабочего каталога или бинарника сервис перестал автоматически запускаться.
#Основные причины: как отличить одну от другой
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| В unit сохранён старый путьExecStart/WorkingDirectory указывает на прежний каталог | код 203/EXEC либо 200/CHDIR | Обновить unit через drop-in с правильным абсолютным путём |
| SELinux маркирует новый каталог иначеФайл доступен обычными правами, но AVC запрещает исполнение | audit показывает denied | Назначить корректный контекст по назначению |
| Не найден файл средыEnvironmentFile ссылается на прошлый адрес | systemctl status сообщает Failed to load environment files | Исправить один параметр и права |
#Пошаговая диагностика и устранение неисправности
- Шаг 1. Установите точное имя отказавшей службыВ терминале посмотрите сбой и время возникновения. Факт, что файл программы существует в новой папке, не означает, что unit знает о переносе.Linux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
UNIT="имя.service"systemctl status "$UNIT" --no-pagerjournalctl -b -u "$UNIT" --no-pager -n 80
- Шаг 2. Прочитайте все параметры и drop-in unitОсобенно важны ExecStart, WorkingDirectory, EnvironmentFile, RootDirectory, StateDirectory и RequiresMountsFor. Редактирование /usr/lib/systemd/system рискованно из-за обновлений, поэтому сохраняйте изменения в /etc/systemd/system с помощью systemctl edit.Linux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
UNIT="имя.service"systemctl cat "$UNIT"systemctl show "$UNIT" -p ExecStart -p WorkingDirectory -p EnvironmentFiles
- Шаг 3. Проверьте доступность нового путиВставьте настоящий новый каталог; namei -l проверит всю цепочку разрешений, а ls -lZ покажет контекст. Если исполняемый файл запускается от User=, проверьте доступ именно этого пользователя.
- Терминал Rocky Linux; административные права не обязательныLinux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
NEW="/srv/новое-приложение"namei -l "$NEW"ls -ldZ "$NEW"
- Шаг 4. Найдите явную ошибку перехода по каталогуПри отсутствии программы возможен status=203/EXEC; при несуществующем WorkingDirectory — 200/CHDIR. Это разные случаи. Если при тесте вручную всё работает, в службе могут отсутствовать переменные среды.
- Терминал Rocky Linux; административные права не обязательныLinux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
UNIT="имя.service"systemctl show "$UNIT" -p User -p ExecStart -p WorkingDirectoryjournalctl -b -u "$UNIT" --no-pager | tail -50
- Шаг 5. Проверьте SELinux на новом путиЕсли AVC точно относится к службе и файлу, проверьте, что restorecon считает правильным контекстом. Если приложение перенесено в нестандартный каталог, понадобится документированное правило fcontext через semanage, а не ручная метка без постоянной политики.
- Терминал Rocky Linux; нужны административные праваLinux · Терминал (Bash)КомандаНужен sudoТерминал Rocky Linux; нужны административные права. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
getenforceNEW="/srv/новое-приложение"sudo restorecon -n -v "$NEW"command -v ausearch && sudo ausearch -m AVC -ts recent | tail -25 || true
- Шаг 6. Измените адрес только через штатное переопределениеЗаранее сохраните unit и запишите исходные пути. Откройте редактор drop-in; при замене ExecStart важно учитывать семантику сброса: сначала пустое ExecStart=, затем новая строка. Не вставляйте пример, пока не известны фактические аргументы запуска.
- Терминал Rocky Linux; нужны административные праваLinux · Терминал (Bash)С осторожностьюНужен sudoТерминал Rocky Linux; нужны административные права. Меняет настройки/состояние службы: сначала копия и возможность отката.
sudo systemctl edit имя.serviceКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- Шаг 7. Перечитайте unit и проверьте реальную функциональностьВ согласованное окно выполните daemon-reload, затем перезапустите только нужный сервис и убедитесь, что он открывает файлы из нового каталога. Если сервис критичен, оставьте возможность вернуть прежнюю конфигурацию.
- Терминал Rocky Linux; нужны административные праваLinux · Терминал (Bash)С осторожностьюНужен sudoТерминал Rocky Linux; нужны административные права. Меняет настройки/состояние службы: сначала копия и возможность отката.
sudo systemctl daemon-reloadsudo systemctl restart имя.servicesystemctl status имя.service --no-pagerКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как убедиться, что неисправность устранена
После перезагрузки нужный сервис автоматически запускается из нового каталога и выполняет свою основную функцию без ошибок 203/EXEC, 200/CHDIR или SELinux.
#Если предложенный способ не сработал
Верните drop-in из резервной копии и предыдущий путь при неуспехе, не изменяйте владельца всего /srv и не выключайте SELinux. Проверьте также отдельные сетевые и дисковые зависимости.