即使我的ssh连接断开,我的MySQL查询也可以继续运行吗?


16

我已经通过SSH连接到服务器并登录到mysql,并要求它运行一个查询(其结果被转储为CSV),这可能需要一个多小时。尽管我已经指示我的客户端每60秒发送一次空数据包以保持会话处于活动状态,但我仍然对mysql查询/进程可能终止感到疑惑,所以我的问题是:

  1. 取消的ssh会话(由于不活动)会杀死mysql查询过程吗?
  2. 如何确保不会发生这种情况-空数据包是否每60秒发送一次足够?

Answers:


9

大多数shell在退出时将SIGHUP发送到前台进程组(在某些bash中,在后台进程中,也由shell选项控制huponexit),这可能导致它死,具体取决于您的mysql客户端如何处理。

您可以运行带有前缀的命令,nohup以使您的shell退出时由init对其进行重载,而不管您的shell是否发送SIGHUP(被init进行重载与nohup无关-只是它已经超过了其父级)。

可能更可口的解决方案是使用tmux,或类似的方法来运行抽象化的客户机screendtach使其脱离Shell和控制终端。这样,如果您的Shell断开连接,则只需重新连接到运行查询所在的会话。

通常,keepalive数据包无关紧要,连接不会无缘无故地终止。更为紧迫的担忧是由于其他原因(网络故障等),客户端与服务器之间的连接丢失。


谢谢!只是为了澄清起见,我正在mysql中运行实际的查询-因此,只要我nohup在登录mysql时添加前缀,这将持久化内部运行的查询?
njp

1
@njp如果您想以交互方式运行,nohup对您来说并没有太大用处,因为mysql REPL不会附加到终端上。尝试使用上面提到的一个多路复用器(或dtach),它们可能会更好地满足您的需求。
克里斯·

2

screen当我套入一个盒子时,我已经开始运行会话,部分是为了防止这种情况发生,另外,我获得了多个选项卡,无法胜任它。如果由于某种原因断开了连接,则可以重新连接到我的屏幕会话。

更新资料

为了回答#2,我将mysql在bash shell中通过屏幕会话运行。听起来很复杂,但这仅仅是:

$: screen
$: mysql

您可以编辑〜/ .screenrc文件以在屏幕会话的底部添加标题,以便您可以跟踪选项卡,重命名选项卡等。如果断开连接,则重新连接时只需运行

$: screen -d

这将显示所有分离的会话。要重新连接,只需运行类似

$: screen -r 551.pts-0.git

或屏幕会话的ID是什么。您就回到了上次停下来的地方。但是,您必须screen -d以与启动屏幕会话相同的用户身份运行,只是fyi,或者当然是root。我不太确定,因为在我总是ssh之后sudo su -,我不必对每个命令都进行sudo。


1
尽管使用建议screen是正确的,但它不能直接回答OP列出的两个问题。
巴伦2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.