#Как распознать проблему и где применимы действия
После изменения WorkingDirectory системная служба запускается из другого каталога: относительные пути к конфигурации или данным перестают находиться, хотя исполняемый файл остался прежним. Перед выполнением определите название программы, редакцию Linux и управляющий сервис. Значения примеров в командах не являются готовой конфигурацией вашего устройства.
#Возможные причины и диагностические признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Неверный WorkingDirectory | status показывает CHDIR или журнал содержит No such file | Уточнить реальный путь и исправить параметр |
| Программа использует относительный путь | Файл существует, если запускать программу из старого каталога | Перевести приложение на абсолютный путь либо вернуть рабочую папку |
| Рабочая папка недоступна User | namei показывает отсутствие права прохода | Выдать минимальный необходимый доступ через владельца |
#Пошаговая диагностика и исправление
- Шаг 1. Зафиксируйте запуск без измененийСверьте User, WorkingDirectory и ExecStart. Если WorkingDirectory пуст, системная служба по умолчанию работает из корня /; это отличается от домашнего каталога при ручном запуске.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)КомандаТерминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
UNIT='имя.service'; systemctl show "$UNIT" -p WorkingDirectory -p User -p ExecStart
- Шаг 2. Найдите потерянный файл в сообщенияхПосмотрите сообщения начиная с последнего запуска и найдите конкретный относительный путь: config.yaml, .env, data/ и т. п. Ошибка CHDIR означает проблему входа в каталог до запуска программы.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)КомандаТерминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
UNIT='имя.service'; journalctl -u "$UNIT" -b -n 100 --no-pager
- Шаг 3. Проверьте путь и каждый родительский каталогВместо примера укажите настоящий WorkingDirectory. namei отображает права на каждом компоненте. Ошибка ENOENT на любом промежуточном каталоге делает запуск невозможным.Linux · Терминал (Bash)КомандаТерминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
namei -l /srv/приложение/currentls -ld /srv/приложение/current
- Шаг 4. Отделите ошибку каталога от правВыполните проверку входа от того же User, что указан в файле службы. Это не запускает саму программу и не меняет данные; если test не прошёл, исправьте доступ строго к нужному каталогу. Команды sudo или sudoedit выполняются с полномочиями администратора; если sudo не установлен, используйте разрешённую административную сессию.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)КомандаНужен sudoТерминал Linux на сервере/клиенте, указанном в шаге. Нужны права администратора; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
sudo -u имя_пользователя test -x /srv/приложение/current && echo 'проход разрешён'
- Шаг 5. Измените только параметр каталогаСначала сделайте копию unit-файла или его локальной надстройки. Откройте редактор, задайте [Service] и WorkingDirectory=/действительный/абсолютный/путь, не меняя ExecStart и права всего дерева. Команды sudo или sudoedit выполняются с полномочиями администратора; если sudo не установлен, используйте разрешённую административную сессию.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)С осторожностьюНужен sudoТерминал Linux на сервере/клиенте, указанном в шаге. Нужны права администратора; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
sudo systemctl edit имя.serviceКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- Шаг 6. Перечитайте настройки и выполните проверкуПосле сохранения вызовите daemon-reload, затем покажите итоговый WorkingDirectory. Restart выполняйте в окно допустимого простоя, после чего убедитесь в открытии нужного файла приложением. Команды sudo или sudoedit выполняются с полномочиями администратора; если sudo не установлен, используйте разрешённую административную сессию.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)С осторожностьюНужен sudoТерминал Linux на сервере/клиенте, указанном в шаге. Нужны права администратора; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
UNIT='имя.service'; sudo systemctl daemon-reloadsystemctl show "$UNIT" -p WorkingDirectorysudo systemctl restart "$UNIT"Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как проверить, что проблема действительно устранена
Для подтверждения запросите приложение или выполните предусмотренную им безопасную операцию с файлом. Если не помогло, сравните абсолютный путь из сообщений журнала и настройки приложения; откат — вернуть прежнее значение WorkingDirectory.
#Если результат не получен
Вернитесь к самому раннему отличающемуся результату диагностики и проверьте точный текст ошибки, текущую загрузку и фактическую версию программы. Не повторяйте опасную команду с другими правами наугад. Если это рабочий сервер, передайте администратору обезличенные отрывки журнала за момент сбоя и уже выполненные действия.