systemd Linux с systemd (конкретный дистрибутив и версия могут отличаться)

После изменения WorkingDirectory сервис не видит файлы

  • Обновлено
  • Чтение ≈ 3 минуты
  • Нужны права администратора

Краткий ответ

После изменения WorkingDirectory системная служба запускается из другого каталога: относительные пути к конфигурации или данным перестают находиться, хотя исполняемый файл остался прежним.

В этой статье
  1. Как распознать проблему и где применимы действия
  2. Возможные причины и диагностические признаки
  3. Пошаговая диагностика и исправление
  4. Как проверить, что проблема действительно устранена
  5. Если результат не получен

#Как распознать проблему и где применимы действия

После изменения WorkingDirectory системная служба запускается из другого каталога: относительные пути к конфигурации или данным перестают находиться, хотя исполняемый файл остался прежним. Перед выполнением определите название программы, редакцию Linux и управляющий сервис. Значения примеров в командах не являются готовой конфигурацией вашего устройства.

#Возможные причины и диагностические признаки

Возможная причинаКак узнатьЧто делать
Неверный WorkingDirectorystatus показывает CHDIR или журнал содержит No such fileУточнить реальный путь и исправить параметр
Программа использует относительный путьФайл существует, если запускать программу из старого каталогаПеревести приложение на абсолютный путь либо вернуть рабочую папку
Рабочая папка недоступна Usernamei показывает отсутствие права проходаВыдать минимальный необходимый доступ через владельца

#Пошаговая диагностика и исправление

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

    Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

  1. Шаг 6. Перечитайте настройки и выполните проверкуПосле сохранения вызовите daemon-reload, затем покажите итоговый WorkingDirectory. Restart выполняйте в окно допустимого простоя, после чего убедитесь в открытии нужного файла приложением. Команды sudo или sudoedit выполняются с полномочиями администратора; если sudo не установлен, используйте разрешённую административную сессию.
  2. Терминал Linux на сервере/клиенте, указанном в шаге
    Linux · Терминал (Bash)С осторожностьюНужен sudo
    Терминал Linux на сервере/клиенте, указанном в шаге. Нужны права администратора; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
    UNIT='имя.service'; sudo systemctl daemon-reload
    systemctl show "$UNIT" -p WorkingDirectory
    sudo systemctl restart "$UNIT"

    Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

#Как проверить, что проблема действительно устранена

Для подтверждения запросите приложение или выполните предусмотренную им безопасную операцию с файлом. Если не помогло, сравните абсолютный путь из сообщений журнала и настройки приложения; откат — вернуть прежнее значение WorkingDirectory.

#Если результат не получен

Вернитесь к самому раннему отличающемуся результату диагностики и проверьте точный текст ошибки, текущую загрузку и фактическую версию программы. Не повторяйте опасную команду с другими правами наугад. Если это рабочий сервер, передайте администратору обезличенные отрывки журнала за момент сбоя и уже выполненные действия.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.