Знание должно быть доступно!

Путь /ОС/Linux

Linger — это функциональность в systemd, которая позволяет юзерским сервисам запускаться даже в том случае, когда пользователь не вошел в систему. Обычно юзерские сервисы (systemctl --user) стартуют только тогда, когда пользователь инициирует сессию (например, через SSH или локально). Однако, включение linger позволяет запускать эти сервисы сразу при старте системы и держать их активными в фоновом режиме.

Почему нужен Linger

Активируя linger для пользователя, можно:

  • Запускать юзерские сервисы и таймеры до входа в систему.
  • Автоматизировать выполнение задач и сервисов для пользователя.
  • Поддерживать долгоживущие процессы, которые не зависят от активной сессии пользователя.

Как работает linger

systemd по умолчанию запускает службы пользователя только при его активном логине. Но если включить linger, то systemd создаст окружение для пользователя и будет поддерживать его, как только система загружается.

Это достигается созданием специального файла в /var/lib/systemd/linger/, который хранит информацию о пользователе и разрешает запуск его сервисов. Когда включён linger, systemd будет автоматически создавать пользовательскую сессию, которая стартует вместе с системой.

Как включить и отключить linger

Включение linger

Для включения linger используйте команду:

sudo loginctl enable-linger <имя_пользователя>

Пример:

sudo loginctl enable-linger proxy

Это создаст файл /var/lib/systemd/linger/proxy, который говорит systemd, что сервисы пользователя proxy могут работать даже без активной сессии.

Отключение linger

Чтобы отключить linger, выполните:

sudo loginctl disable-linger <имя_пользователя>

Пример:

sudo loginctl disable-linger proxy

Это удалит файл /var/lib/systemd/linger/proxy, и юзерские сервисы снова будут запускаться только при активной сессии.

Проверка статуса linger

Чтобы проверить, включён ли linger для конкретного пользователя:

loginctl show-user <имя_пользователя> | grep Linger

Пример:

loginctl show-user proxy | grep Linger

Если ответ будет Linger=yes, значит linger активирован для данного пользователя.

Как использовать linger на практике

Пример: Автозапуск сервиса Shadowsocks

Предположим, у нас есть юзерский сервис shadowsocks, и мы хотим, чтобы он запускался автоматически при старте системы без необходимости логина пользователя proxy.

Создаём юзерский сервис: Создаем файл сервиса в ~/.config/systemd/user/shadowsocks.service:

[Unit]
Description=Shadowsocks Service
After=network.target

[Service]
ExecStart=/usr/bin/ssserver -c /home/proxy/.config/shadowsocks/config.json -d start
ExecStop=/usr/bin/ssserver -c /home/proxy/.config/shadowsocks/config.json -d stop
RemainAfterExit=yes

[Install]
WantedBy=default.target

Активируем linger для пользователя proxy:

sudo loginctl enable-linger proxy

Включаем и запускаем юзерский сервис: Выполняем от имени пользователя proxy:

systemctl --user enable shadowsocks
systemctl --user start shadowsocks

Перезагружаем сервер и проверяем: После перезагрузки сервера, даже если пользователь proxy не вошел в систему, shadowsocks будет запущен автоматически:

systemctl --user status shadowsocks

Ограничения и безопасность

  • Ресурсы: При включении linger для пользователя, systemd создаёт его окружение, что может потреблять дополнительные системные ресурсы. Важно учитывать это, если на сервере много пользователей.
  • Безопасность: linger открывает возможность для юзерских сервисов работать в фоне без активного логина. Убедитесь, что эти сервисы настроены безопасно и не создают уязвимостей.

Заключение

Linger — это мощный инструмент для автоматизации запуска сервисов пользователя, позволяющий обойтись без ручного входа в систему. Это полезно для серверов и систем, где требуются длительные процессы, работающие в фоновом режиме.