我正在运行 KDE Neon,它是 Ubuntu 18.04 Bionic (LTS),并在其上安装了最新的 KDE 桌面包。
自从从 Xenial 升级到这个版本后,我失去了进程在 SSH 会话断开连接后继续存在的能力...特别是 nohup、tmux、screen、byobu 及其所有子进程在断开连接时都会被终止。
这是一个简单的测试来演示这个问题
# connect over ssh
cd /tmp
nohup watch date &
ps -ef | grep watch
# disconnect and reconnect
ps -ef | grep watch # process is gone
我尝试将 tmux 和 byobu 恢复到旧版本,然后发现 nohup 也受到了影响。这让我相信问题出在 SSHd 配置或 systemd 上。
显然,systemd 决定改变其默认行为,即在用户断开连接时清除所有用户进程。我尝试通过编辑 /etc/systemd/logind.conf 并设置 KillUserProcesses=no 然后重新启动来恢复该行为(service systemd-logind restart 不起作用)。它不起作用...我束手无策了。
帮助!
答案1
我刚刚确切地同样的问题,巧合的是,在安装了 KDE Neon 包的 Ubuntu 18.04 中也出现了同样的问题。
事实证明当你的会话结束时,systemd 将终止所有用户进程,例如当您终止 SSH 登录时,因为您认为稍后只需使用 tmux 重新连接。;)
要修复此问题,请执行以下步骤:
对 进行以下更改
/etc/systemd/logind.conf
:KillUserProcesses=no KillExcludeUsers=root YOUR_USER_NAME
然后重新启动
systemd-logind
:sudo systemctl restart systemd-logind
使用以下方式为您的帐户启用延迟:
loginctl enable-linger YOU_USER_NAME
我最初只启用了 lingering 和KillUserProcesses=no
,但我的 tmux 仍然被杀死。只有在我修改后KillExcludeUsers
(感谢https://askubuntu.com/a/1097134/59971)我才能安心地继续我的神经网络训练。
答案2
您想使用该setsid
命令使其成为会议主持人。
nohup
表示“不挂断”,这在很大程度上只是断开各种标准输入/输出流,但该进程仍由 bash 进程“拥有”,而 bash 进程又由 SSH 进程拥有。当您断开与 SSH 的连接时,所有这些子进程都会随之断开。
通过使用,setsid
您可以在 SSH 范围之外重新设置该进程的父级。