SystemdDoctor
User= [Service]

User= в systemd: от кого работает служба

Задаёт системного пользователя, от имени которого выполняются процессы службы. Без него служба работает от root, что для большинства служб излишне.

Проверено на тестовой машине: systemd 255, Ubuntu 24.04. Сверено с документацией 15 сентября 2026. Как мы проверяем

Что делает

Смена пользователя происходит до запуска программы, поэтому все последующие действия — переход в рабочий каталог, открытие файлов вывода, доступ к файлам — выполняются уже от него. Это объясняет, почему проверять права надо через sudo -u, а не от root: root видит совсем другую картину.

Пользователя systemd не создаёт (кроме случая DynamicUser=yes). Он должен существовать в системе на момент запуска, иначе служба падает с кодом 217/USER. Для служб принято завести системного пользователя без оболочки и домашнего каталога.

Где ставится. В секции [Service]. Для служб пользователя (systemctl --user) параметр недоступен.

Значения

ЗначениеЧто происходит
appимя существующего пользователя.
998числовой идентификатор — работает, но читается хуже имени.
%iподстановка экземпляра в шаблонном unit.

Пример

Служба от отдельного пользователя с доступом только к своим каталогам.

[Service]
User=app
Group=app
StateDirectory=myapp
ExecStart=/usr/local/bin/myapp

Параметр StateDirectory= тут не случайно: systemd сам создаст /var/lib/myapp и назначит владельцем пользователя службы.

Типичные ошибки

Пользователя нет в системе — запуск завершается кодом 217/USER до выполнения программы.

Порты ниже 1024 недоступны обычному пользователю: нужна возможность CAP_NET_BIND_SERVICE или сокет-активация.

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

Окружение пользователя (.bashrc, .profile) служба не читает: переменные задаются в unit-файле.

Связанные ошибки

  • status=217/USER в systemdКод 217/USER означает, что systemd не смог определить или сменить пользователя из User=. Разбор причин: пользователя нет, имя недопустимо, конфликт с DynamicUser.
  • Permission denied в журнале службыОтказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
  • bind: Permission denied при привязке к портуОтказ при привязке к порту: обычно порт ниже 1024 у службы от непривилегированного пользователя. Как дать возможность CAP_NET_BIND_SERVICE.
  • status=200/CHDIR в systemdКод 200/CHDIR означает, что systemd не смог перейти в каталог из WorkingDirectory= до запуска программы. Причины и решение.

Рядом стоящие параметры

Где важен на практике

Источники

  • systemd.exec(5) официальная документация
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04) собственная проверка
    сверено 15 сентября 2026