到目前为止,我习惯于能够tmux
通过 SSH 运行,如果我断开连接,tmux
当我重新连接时会话仍然会运行。
因此,我假设可以通过以一个用户身份启动 tmux 会话(使用 GNOME 的终端应用程序)然后注销 GNOME 并重新连接到它(例如通过 SSH)来完成相同的操作。事实证明我错了。
有趣的是,当我执行以下操作作为解决方法时,它似乎有效:
ssh $(whoami)@localhost
- 开始
tmux
会话 - 断开
- 从 GNOME 注销
- 以另一个用户身份重新登录
- 使用 SSH 连接到步骤 1 中的用户
- 重新连接到
tmux
会话
唉,我不明白为什么 GNOME 在注销时似乎会杀死该用户的所有进程。
有比上述解决方法更好的方法吗?也许是Bash 内置函数的一些 GNOMEish 版本fg
// bg
?disown
答案1
同时我对此进行了进一步的研究。 Nicholas 的 systemd 指针非常准确。似乎有几种方法可以缓解这个问题:
1.logind.conf
/etc/systemd/logind.conf
and Friends 包含三个相关设置:
KillUserProcesses=
(如果yes
注销会导致systemd-logind.service(8)
会话被杀死。KillOnlyUsers=
将允许限制应用上述设置的用户列表(空格分隔的列表,例如adam eve joe jane
)。KillExcludeUsers=
与之前的设置相反,使用户免受 的影响KillUserProcesses=yes
。
因此,可以设置或仅包含KillUserProcesses=no
用户(如果使用 GNOME)或列出用户,以便在登录会话拆卸时免于进程终止。gdm
KillOnlyUsers
KillExcludeUsers
您可以通过 来查看会话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)
screen
KillUserProcesses=yes
logind.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,您介意找到并尝试其他答案,例如这里。