前言

前段时间折腾 arch linux 的时候遇到了一个非常无厘头的问题:凡是在 ssh 中开启的 screen ,在 ssh 连接被断开时总会被自动杀死,就像一个普通进程一样。而在实机上开启的 screen 则不存在这样的问题,即使使用 ssh 去访问它也不会遇到断开时被杀死的问题。
这个问题真的非常神奇,众所周知 screen 不应该是这样的。我查了很多资料都没有结果,但是其中的一个帖子提供了一些解决方案,即使这个帖子中提到的问题原因似乎并不适用我所遇到的情况(配置和服务的选择并不存在问题,我怀疑是不是 systemd 的上游哪里改炸了)。

https://unix.stackexchange.com/questions/171503/tmux-session-killed-when-disconnecting-from-ssh

但总而言之,systemd 把 ssh 会话和 screen 进行了绑定,导致 screen 会被连带杀死。

临时解决方案

一:将 screen 运行在独立的 scope 单元中

systemd-run --scope --user screen

使用上述方式启动的 screen 可以和 ssh 解绑,从而绕开这个问题。
你可以为上面的命令创建个 alias 或者写个 bin 来便于执行。

注意:上面的方法所创建的 screen 在当前用户的所有会话全部断开后依然会被杀死,你可以使用 loginctl enable-linger 来解决这个问题。不过对于我来说,桌面环境一直没有注销,因此不会遇到这个问题。

二:换用 tmux 并配置 systemd 自动创建

tmux 是一个增强版的 screen ,但是仍然会遇到上述问题。

tmux 提供了一个开机自动创建会话的功能,开机时自动创建的会话不会与 ssh 绑定,因此不会在 ssh 退出时被杀死。
配置方式可以参照 arch wiki:
https://wiki.archlinux.org/title/tmux#Autostart_with_systemd

这种方法在配置完成后,每次开机时会自动创建一个 tmux 会话,因此登录 ssh 后只要使用 tmux ls 就可以在会话列表里找到这个提前创建好的会话了,这个会话不存在被自动杀死的问题,但是呢,直接用 tmux 创建的新会话依然会存在这个问题,你需要使用 systemctl start 来创建不会被杀死的新会话。

感觉并没有从根本上解决问题,而且还不如方案一方便。

还在期末考,问题的原因就不细挖了,能用就行。

追记

截止 2023-02-25 ,这个问题似乎已经被修复,不再能够复现了。
按照我目前有限的知识,这个问题大概率和 systemd-logind 配置(/etc/systemd/logind.conf)中的 KillUserProcesses 属性有关,如有遇到类似问题可以朝这个方向关注一下。