Systemd Linger:破除迷思与实战应用
终止进程
systemd 最具争议的功能之一,就是用户在注销登录时可以选择终止用户进程。最初,这一功能也会导致 screen/tmux/nohup 进程被终止。
在最近的 Debian 发行版中,systemd-logind(systemd 的登录管理器)的默认配置是允许进程持续运行;在配置文件 /etc/systemd/logind.conf 中,有一个名为 “KillUserProcesses”的选项,可以启用该选项来终止用户进程。
如果选择此选项,还可以指定仅终止特定用户的进程,并排除某些用户(默认情况下会排除 root 用户)。如果你使用该选项,似乎还可以通过一个 systemd 单元来启动 screen,从而避免在注销登录时将其终止。
对于某些特定的用户场景来说,这一功能非常实用。有一次,我为一些不太擅长使用电脑的同事提供支持,而他们所使用的系统运行的是 KDE 环境,结果一些 KDE 进程会一直停留在后台。
因此,通过注销登录后再重新登录来解决 akonadi 或其他 KDE 服务出现异常的问题并不奏效。于是我在那台系统中启用了“终止用户进程”选项,这不仅减少了他们遇到的问题数量,还无需重启系统。
普遍认为,“滞留”功能是让 screen/tmux/nohup 能够正常工作的必要条件——但在 Debian(以及大概大多数发行版)中,事实并非如此。
或许有些配置组合需要启用“滞留”才能让 screen/tmux 正常工作,但我并不打算去一一尝试找出这些组合。在我直接支持过的数百名 Linux 桌面用户中,没有一个人能够同时使用 screen/tmux,更别提那种让我忍不住想在用户注销时自动终止其进程的“无知”状态了。
控制“滞留”功能
如果你安装了 polkit 并且采用的是典型配置,可以通过以下命令为自己的账户启用或禁用“滞留”功能:
loginctl enable-linger loginctl disable-linger
如果以 root 用户身份运行,你可以通过以下命令为其他用户启用或禁用“滞留”功能:
loginctl enable-linger $ACCOUNT loginctl disable-linger $ACCOUNT
目前似乎并没有任何官方文档说明如何检测某个账户是否启用了“滞留”功能,或者列出所有已启用该功能的账户。看起来,唯一的选择就是运行 “ls /var/lib/systemd/linger”。
Debian 上的“滞留”功能
在默认配置接近于标准设置的 Debian 系统中,进程在注销登录时并不会被终止。而“滞留”功能唯一的作用,就是在用户登录之前,以用户自身的上下文启动程序。
最近,一位朋友在我的一台服务器上测试了一组大型 LLM 程序,他用来运行这些程序的账户最终被设置了“滞留”功能。据推测,他所运行的安装脚本中,有一部分代码是基于这样一种假设:只有启用“滞留”功能,nohup 才能正常工作——而实际上,它在未被询问的情况下就自动完成了这一设置。
我发现这种行为的一个好处,是在我的笔记本电脑上。目前,我正在对笔记本电脑上的 SE Linux 策略进行测试,并且经常对其进行重启。
当我为自己的账户启用了“滞留”功能后,笔记本电脑在启动时就能自动连接到 Wi-Fi,而无需登录,这非常方便。即使 X11/Wayland 登录配置出现故障,我依然可以远程登录到这台电脑。
在完成这些测试之后,我会继续将“滞留”功能保持启用状态。因为像 Pipewire 和蓝牙这样的后台进程会在我登录前自动启动,所以当我自己登录时,系统应该会稍微快一点。
YARPP 列表
相关文章:系统注释 几个月前,我曾就 systemd 进行过一次讲座……Systemd 的以太网接口命名 systemd 提供了一种全新的方式,用于为以太网设备指定名称……Systemd、移动Linux与容器 我在使用……的过程中,遇到了一些问题,无法在自己的系统上运行想要的应用程序。