如何修复 nohup、byobu、tmux、screen 等,使其在断开 SSH 连接时不会死机?

如何修复 nohup、byobu、tmux、screen 等,使其在断开 SSH 连接时不会死机?

我正在运行 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 重新连接。;)

要修复此问题,请执行以下步骤:

  1. 对 进行以下更改/etc/systemd/logind.conf

    KillUserProcesses=no
    KillExcludeUsers=root YOUR_USER_NAME
    

    然后重新启动systemd-logind

    sudo systemctl restart systemd-logind
    
  2. 使用以下方式为您的帐户启用延迟:

    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 范围之外重新设置该进程的父级。

相关内容