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

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

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

谢谢!

答案1

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

然而,有几种方法可以实现这些“特殊措施”。从最简单到最复杂/最复杂:

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

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

    % client: ssh server
    # server: screen
    # server[0]: mysql -e 'really long query'
    <disconnect>
    

    后者回来说:

    % 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>
    

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

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

答案2

关闭 SSH 连接将结束该会话内启动的所有进程。

看一下screen命令,它可以让您在 shell 内启动会话,然后稍后从另一个本地或远程 shell 重新连接到它。

相关内容