当前版本的 Xorg 是否侦听正在关闭的 systemd-login 会话?

当前版本的 Xorg 是否侦听正在关闭的 systemd-login 会话?

Xorg 与 systemd-logind 集成,使其能够有效地打开所需的设备,而无需以超级特权root用户身份运行。当 systemd-logind 会话结束时,systemd-logind 将撤销 Xorg 对设备的访问权限(撤销文件描述符[1])。

但是结束会话真的会导致 Xorg 退出吗?

这个问题是从 Fedora 版本 26 xorg-x11-server-Xorg-1.19.3-4.fc26.x86_64 开始编写的。


[1] 或者从技术上讲,我认为登录撤销了描述打开设备时创建。文件描述符是每个进程的;登录不能直接影响描述符在 Xorg 进程中。

答案1

不会。代码不会侦听它,并且它可以轻松地继续运行,而无需访问任何设备(并且不需要重新获得访问权限)。我认为这是 Xorg 与 systemd-logind 集成的一个疏忽。

目前,Xorg 需要在与会话关联的“范围”单元中运行。尽管它可以扩展为接受 XDG_SESSION_ID 环境变量。这就是最初引发我问题的原因。

如果会话因会话领导者(第一个进程)退出而结束,则仅当上游默认 KillUserProcesses=yes 保留在 中时,作用域才会停止logind.conf。否则,会话将被“放弃”,从而允许 GNU Screen 等进程tmux继续运行。大多数发行版禁用 KillUserProcesses;这是一个非常值得怀疑的默认值。

loginctl terminate-session将始终停止示波器单元。虽然,停止作用域单元最初会发送 SIGHUP,显然是因为“bash 和朋友”倾向于忽略 SIGTERM。因为某些原因。 Xorg 与许多守护进程一样,特别对待 SIGHUP。 Xorg 将 SIGHUP 视为重置服务器的信号,而不是退出。我认为这意味着 systemd 将在超时后发送 SIGKILL,并且 Xorg 仍未退出。 Xorg 会在没有得到适当清理的情况下被强行杀死。

重现 Xorg 不退出的步骤:

  1. nohup /usr/libexec/Xorg :5 vt5 -keeptty -novtswitch以非 root 用户身份运行。 (vt5 假设您从文本控制台 5 运行此命令,又称为 ctrl+alt+f5)。
  2. 切换到不同的文本控制台。登录。用于ps -ax | grep bash查找在 上运行的 bash shell 的 PID tty5。跑步kill -SIGHUP <PID>
  3. bash 进程退出,注销您的会话。如果切换回 VT 5,您将看到控制台登录提示。但 Xorg 进程实际上仍在运行!

    在该 Xorg 实例的日志文件中,您将看到它尝试释放并重新打开它仍然认为属于它的所有设备。这就是 Xorg 重置时发生的情况。现在会话结束,没有任何设备可供使用,因此所有打开设备的尝试都会失败。

    Xorg 重置,因为它被发送 SIGHUP (尽管nohup:-)。我注意到这一点是因为我依恋gdb它。收到 SIGHUP 是因为 Xorg 重新打开/dev/tty5自身,将其获取为“控制终端”。您可以在 中看到控制终端ps -ax | grep Xorg。当您终止 bash 来强制注销时,系统会在 TTY 上生成挂断 (HUP)。除非您设置了 KillUserProcesses,否则不会向 Xorg 发送任何比 SIGHUP 更强的信号。

如果没有novtswitch,重置也会尝试切换 VT。但非 root X 永远无法更改活动 VT。由于步骤 3 是从不同的 VT 运行的,因此此 VT 切换尝试将会失败。切换 VT 失败会导致 Xorg 退出。

这些步骤中的nohup是必需的,否则 Xorg 将被终止。这与 shell 作业管理有关。证明:如果您不使用nohup,而是使用命令 禁用作业管理, Xorg 也会继续运行set +m

相关内容