Служба пользователя не запускается или не переживает выход
Службы пользователя живут в отдельном менеджере, который запускается вместе с сеансом и останавливается при выходе. Чтобы они работали без входа в систему, нужно разрешить задержку сеанса для пользователя.
Что это значит
Отличий от системных служб несколько: свои каталоги (~/.config/systemd/user), свои команды с ключом пользователя, недоступность параметров вроде User= и отрицательных приоритетов, и зависимость жизни от сеанса.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Служба останавливается при выходе из системы
Менеджер пользователя завершается вместе с последним сеансом. Это поведение по умолчанию.
-
Файл лежит не в том каталоге
Службы пользователя ищутся в ~/.config/systemd/user, а не в /etc/systemd/system. Файл в системном каталоге менеджер пользователя не увидит.
-
Используются параметры, недоступные службам пользователя
Параметры смены пользователя, отрицательные приоритеты, часть возможностей и большинство ограничений ресурсов в менеджере пользователя недоступны.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Состояние службы в менеджере пользователя.
systemctl --user status myapp.service --no-pager | head -10Разрешена ли работа без входа в систему.
loginctl show-user $USER -p LingerЖурнал службы пользователя: он отдельный.
journalctl --user -u myapp.service -n 30 --no-pagerРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Менеджер пользователя завершается вместе с последним сеансом. Это поведение по умолчанию.
- Как проверить
-
Посмотрите, разрешена ли задержка сеанса.
loginctl show-user $USER -p Linger loginctl list-users
- Как исправить
-
Разрешите задержку сеанса для пользователя: тогда его менеджер будет работать и без входа.
sudo loginctl enable-linger $USER
- Почему происходит
- Службы пользователя ищутся в ~/.config/systemd/user, а не в /etc/systemd/system. Файл в системном каталоге менеджер пользователя не увидит.
- Как проверить
-
Посмотрите, что видит менеджер пользователя.
systemctl --user list-unit-files | grep myapp ls -l ~/.config/systemd/user/
- Как исправить
-
Перенесите файл в каталог пользователя и перечитайте конфигурацию с ключом пользователя.
systemctl --user daemon-reload && systemctl --user enable --now myapp.service
- Почему происходит
- Параметры смены пользователя, отрицательные приоритеты, часть возможностей и большинство ограничений ресурсов в менеджере пользователя недоступны.
- Как проверить
-
Посмотрите сообщения при запуске.
systemctl --user status myapp.service --no-pager | head -10 journalctl --user -u myapp.service -n 30 --no-pager
- Как исправить
- Уберите недоступные параметры или переведите службу в системный менеджер, если ей нужны такие права.
Пример вывода
Служба остановилась вместе с выходом из системы. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ systemctl --user status myapp.service --no-pager | head -4
○ myapp.service - Моя служба
Loaded: loaded (/home/user/.config/systemd/user/myapp.service; enabled)
Active: inactive (dead)
$ loginctl show-user user -p Linger
Linger=no
Связанные ошибки
- Unit … not found: unit-файл не найден Сообщение Unit not found при запуске службы: файла нет, не выполнен daemon-reload, опечатка в имени или не указано расширение.
- status=206/OOM_ADJUST в systemd Код 206/OOM_ADJUST: не удалось изменить оценку OOM для процесса службы. Обычно мешают права или значение вне диапазона.
- status=201/NICE в systemd Код 201/NICE: systemd не смог выставить приоритет процесса из Nice=. Обычно мешает предел LimitNICE или отсутствие прав.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Apache: правила .htaccess не действуют Файл .htaccess игнорируется: запрещён параметром AllowOverride, нет нужного модуля, файл не читается.
- Configuration file is marked executable Предупреждение о правах: unit-файл помечен исполняемым. Откуда берётся и почему это стоит исправить.
- Configuration file is marked world-inaccessible Предупреждение о правах на unit-файл: служба работает, но файл недоступен для чтения другим.
- Docker: unable to configure the Docker daemon with file daemon.json Демон Docker не запускается из-за ошибки в /etc/docker/daemon.json: неверный JSON или неизвестный ключ.
Источники
-
user@.service(5)
Менеджер пользователя и его каталоги. -
loginctl(1)
Команда enable-linger. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено: без задержки сеанса служба пользователя завершается при выходе.