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

iro*_*orm 5 ssh tmux nohup systemd-logind systemd

我正在运行 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
Run Code Online (Sandbox Code Playgroud)

我尝试将 tmux 和 byobu 恢复到旧版本,然后发现 nohup 也受到影响。这让我相信它要么是 SSHd 配置,要么是 systemd。

显然,systemd 决定更改其默认行为,以便在用户前一段时间断开连接时核对所有用户进程。我尝试通过编辑 /etc/systemd/logind.conf 并设置 KillUserProcesses=no 然后重新启动(服务 systemd-logind 重新启动不起作用)来恢复该行为。没用……我已经束手无策了。

帮助!

Cha*_*tha 4

我刚刚遇到了完全相同的问题,巧合的是,Ubuntu 18.04 也安装了 KDE Neon 软件包。

事实证明,当会话结束时,systemd 会终止所有用户进程,例如,当您终止 SSH 登录时,因为您认为稍后会使用 tmux 重新连接。;)

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

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

    KillUserProcesses=no
    KillExcludeUsers=root YOUR_USER_NAME
    
    Run Code Online (Sandbox Code Playgroud)

    并重新启动systemd-logind

    sudo systemctl restart systemd-logind
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过以下方式为您的帐户启用延迟:

    loginctl enable-linger YOU_USER_NAME
    
    Run Code Online (Sandbox Code Playgroud)

我最初只启用了 lingering 和KillUserProcesses=no,但我的 tmux 仍然被杀死。只有修改后KillExcludeUsers(感谢https://askubuntu.com/a/1097134/59971)我才能安心继续我的神经网络训练。


Kri*_*ves 1

您想使用该setsid命令使其成为会话领导者

nohup意味着“不挂起”,这在很大程度上只是断开各种标准输入/输出流的连接,但该进程仍然由 bash 进程“拥有”,而 bash 进程又由 SSH 进程拥有。当您与 SSH 断开连接时,所有这些子进程都会随之消失。

通过使用setsid您可以在 SSH 范围之外重新设置进程的父级。