青蛙小白
博客 / 2016/03

使用 loginctl enable-linger 让 systemd 用户服务在退出登录后继续运行

2016/03/25 · — 字 · 阅读约 — 分钟 ·
目录

在 Linux 系统中,尤其是使用 systemd 的发行版,默认情况下用户的 systemd --user 实例只有在用户登录会话(Session)处于活动状态时才会运行。一旦用户退出登录,所有的用户级服务都会被终止。

如果需要运行一些持久化的用户级后台服务,但又不想赋予这些服务系统级(Root)权限,那么 Linger 机制就是关键。

1. 什么是 Linger?

Linger 是 systemd-logind 提供的一个机制。它的核心作用是:允许某个用户在“没有登录”的情况下,仍然保持其用户服务(User Manager)运行。

默认行为:用户退出即停止

当用户 <username> 通过 SSH 登录时,systemd 会启动:

  1. User Session
  2. systemd --user 实例
  3. 该用户配置的所有用户级服务

一旦用户执行 exit 退出,系统检测到该用户已不在线,会关闭 Session 并杀掉该用户的所有进程,包括 systemd --user

开启 Linger 后的行为

开启 Linger 后,系统会确保该用户的 systemd --user 实例在系统启动时就自动运行,并且在用户完全退出登录后依然保持常驻。


2. 如何操作 Linger

查看当前 Linger 状态

使用 loginctl 命令查看指定用户的状态:

loginctl show-user <username> | grep Linger
  • Linger=no:未开启(默认)
  • Linger=yes:已开启

开启 Linger

需要 root 权限或 sudo 执行:

sudo loginctl enable-linger <username>

执行后,即使该用户断开 SSH,其用户级服务也不会停止。

验证开启成功

再次检查状态,确认输出为 Linger=yes

loginctl show-user <username> | grep Linger
# 输出:Linger=yes

关闭 Linger

如果不再需要此功能,可以将其禁用:

sudo loginctl disable-linger <username>

3. Linger 的典型应用场景

1) 用户级服务开机自启

如果你通过 systemctl --user enable myapp.service 设置了服务,只有在开启 Linger 后,这些服务才能在系统启动时(且无需用户手动登录)自动运行。

2) 用户级定时任务 (systemd timer)

systemd 用户级定时任务同样依赖于用户实例的运行。开启 Linger 可以确保这些任务在后台按计划执行。


4. 底层原理

Linger 的实现非常简单直接。当你启用 Linger 时,systemd-logind 会在以下路径创建一个以用户名命名的空文件:

/var/lib/systemd/linger/<username>

你可以通过 ls -l /var/lib/systemd/linger/ 来确认。systemd-logind 会在启动时检查该目录,并为其中的每个用户启动一个 [email protected]


5. 总结

Linger = 给用户一个永久的后台运行权限。

开启 Linger 就像是给了该用户一个“常驻”名额,让其 systemd --user 实例脱离登录会话的生命周期。

副作用提示: 开启 Linger 后,用户即使不登录也会持续占用少量系统资源。管理员应仅为确实需要运行后台服务的用户开启此功能,并注意监控这些用户的进程资源占用情况。

TAGS # linux
评论