如果我通过 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 重新连接到它。