如何防止退出 GNOME 时进程被终止?

如何防止退出 GNOME 时进程被终止?

到目前为止,我习惯于能够tmux通过 SSH 运行,如果我断开连接,tmux当我重新连接时会话仍然会运行。

因此,我假设可以通过以一个用户身份启动 tmux 会话(使用 GNOME 的终端应用程序)然后注销 GNOME 并重新连接到它(例如通过 SSH)来完成相同的操作。事实证明我错了。

有趣的是,当我执行以下操作作为解决方法时,它似乎有效:

  1. ssh $(whoami)@localhost
  2. 开始tmux会话
  3. 断开
  4. 从 GNOME 注销
  5. 以另一个用户身份重新登录
  6. 使用 SSH 连接到步骤 1 中的用户
  7. 重新连接到tmux会话

唉,我不明白为什么 GNOME 在注销时似乎会杀死该用户的所有进程。

有比上述解决方法更好的方法吗?也许是Bash 内置函数的一些 GNOMEish 版本fg// bgdisown

答案1

同时我对此进行了进一步的研究。 Nicholas 的 systemd 指针非常准确。似乎有几种方法可以缓解这个问题:

1.logind.conf

/etc/systemd/logind.confand Friends 包含三个相关设置:

  • KillUserProcesses=(如果yes注销会导致systemd-logind.service(8)会话被杀死。
  • KillOnlyUsers=将允许限制应用上述设置的用户列表(空格分隔的列表,例如adam eve joe jane)。
  • KillExcludeUsers=与之前的设置相反,使用户免受 的影响KillUserProcesses=yes

因此,可以设置或仅包含KillUserProcesses=no用户(如果使用 GNOME)或列出用户,以便在登录会话拆卸时免于进程终止。gdmKillOnlyUsersKillExcludeUsers

您可以通过 来查看会话loginctl list-sessions

2.loginctl enable-linger username

您可以通过执行以下命令为当前会话启用延迟loginctl(1)在会话范围内如下所示(显然替换username为实际用户名 或$(whoami)):

loginctl enable-linger username

线索可以从logind.conf(5)手册页:

除了会话进程之外,用户进程还可以在用户管理器单元下运行[email protected]。根据延迟设置,这可能允许用户独立于其登录会话运行进程。参见enable-linger中的描述loginctl(1)

3.systemd-run --scope --user command

该手册用于logind.conf(5)包含这一点的线索:

请注意,设置KillUserProcesses=yes将破坏screen(1)和等工具tmux(1),除非将它们移出会话范围。请参阅示例systemd-run(1)

确实在看手册systemd-run(1)我们发现下面的例子:

示例 5. 作为用户服务的启动屏幕

$ systemd-run --scope --user screen Running scope as unit
run-r14b0047ab6df45bfb45e7786cc839e76.scope.

$ screen -ls There is a screen on:
        492..laptop     (Detached) 1 Socket in /var/run/screen/S-fatima.

这将在范围单元中将进程作为由 启动的进程screen的子进程来启动。使用单元而不是 单元,因为从终端分离时会退出,并且服务单元将被终止。作为用户单元运行屏幕的优点是它不属于会话范围。如果在默认情况下配置,则当用户注销该会话时,会话范围将终止。systemd --user[email protected]systemd.scope(5)systemd.service(5)screenKillUserProcesses=yeslogind.conf(5)


测试用

systemd 245 (245.4-4ubuntu3.2)
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=hybrid

答案2

这可能与 systemd 有关,在某些时候我听说他们在注销时杀死了所有守护进程(忽略了之前数十年的 Unix 实践!),但我已经有一段时间没有听说过它了,所以我认为他们要么改变了回来,这是很容易修复的问题,或者包装商正在处理,所以用户看不到它。

无论如何,如果是 systemd,您介意找到并尝试其他答案,例如这里

相关内容