WorkingDirectory= в systemd: рабочий каталог службы
Задаёт каталог, который станет текущим для процессов службы. Путь абсолютный; переход выполняется после смены пользователя, поэтому доступ нужен именно ему.
Что делает
Параметр важен для программ, которые ищут файлы относительно текущего каталога: шаблоны, статику, файлы настроек. Без него текущим каталогом будет корень файловой системы, и такие программы не найдут своих файлов.
Если переход не удался, служба завершается с кодом 200/CHDIR ещё до запуска программы. Дефис перед путём делает каталог необязательным: при его отсутствии процесс запустится в корне.
Где ставится. В секции [Service]. Допустима тильда — домашний каталог пользователя службы.
Значения
| Значение | Что происходит |
|---|---|
/opt/myapp | обычный вид: абсолютный путь. |
-/opt/myapp | каталог необязателен: его отсутствие не считается ошибкой. |
~ | домашний каталог пользователя из User=. |
Пример
Программа, которая ищет файлы рядом с собой.
[Service]
User=app
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/server --config config/app.yml
Относительный путь в аргументе допустим: его разбирает сама программа относительно рабочего каталога. Путь же в ExecStart= обязан быть абсолютным.
Типичные ошибки
Относительный путь недопустим: unit не загрузится.
Каталог должен быть доступен пользователю службы, а не только root: нужен бит x на каталоге и на всём пути.
Каталог на отдельном разделе может быть ещё не смонтирован при запуске: нужен RequiresMountsFor=.
systemd не создаёт этот каталог сам, в отличие от StateDirectory=.
Связанные ошибки
- status=200/CHDIR в systemdКод 200/CHDIR означает, что systemd не смог перейти в каталог из WorkingDirectory= до запуска программы. Причины и решение.
- Permission denied в журнале службыОтказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- No such file or directory в журнале службыСлужба не находит файл или каталог. Разбор: путь, момент запуска, изоляция unit-файла, символические ссылки, приватный /tmp.
Рядом стоящие параметры
Источники
- systemd.exec(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)