如果我在执行命令后关闭连接,可能需要几个小时才能执行的查询是否会继续在远程服务器上执行?

sil*_*lse 5 ssh mysql database-administration

如果我通过 ssh 连接到远程数据库服务器,启动 mysql 客户端并执行一个可能需要几个小时才能执行的查询,然后关闭连接,查询会继续执行直到完成吗?我可以在一个巨大的数据库上以这种方式进行mysqldump,几天后返回并期望一切都完成吗?

谢谢!

cri*_*ret 5

简而言之:否 - 除非您采取特殊措施,否则当远程启动的 shell 退出时,服务器上任何长期存在的命令都将终止sshssh如果您终止会话,或者即使 TCP 连接中断(丢失网络连接、切换 WiFi 网络、休眠等),该 shell 也会退出。

然而,有多种选择可以实现这些“特别措施”。从最简单到最复杂/涉及:

  • nohup - 只需在您的单行命令前面添加nohup. 如果您可以假设该命令将执行然后自行终止,则此方法有效。输出将发送到nohup.out当前目录中的文件。例子:

    nohup sh -c "sleep 5; echo done" &
    
    Run Code Online (Sandbox Code Playgroud)
  • screen -screen将设置一个虚拟终端窗口,当您的连接终止时该窗口不会退出ssh。您可以稍后重新连接到服务器并查看您正在运行的任何命令的状态并发出新命令。例子:

    % client: ssh server
    # server: screen
    # server[0]: mysql -e 'really long query'
    <disconnect>
    
    Run Code Online (Sandbox Code Playgroud)

    后者回来后:

    % client: ssh server
    # server: screen -RD  # -RD says "reconnect to my previous screen, even it already attached"
    # server[0]: <right where you left off in the previous screen>
    
    Run Code Online (Sandbox Code Playgroud)

    有很多选项screen,您可以在一个会话中创建多个“终端” screen,并且可以在文件中对其进行广泛配置~/.screenrc

  • moshssh -无论网络连接如何都将维持会话的替代品当您在 wifi 网络之间迁移,甚至休眠/唤醒您的计算机时,mosh将重新连接到服务器。此外,它将提供一个无延迟的界面来工作,因此当您键入命令时,您不会受到链接或服务器缓慢的影响。请注意,mosh 用于ssh建立初始连接并在远程端设置 UDP 服务器。