ssh接続が切断されても、MySQLクエリは引き続き実行されますか?


16

SSHを介してサーバーに接続し、mysqlにログインし、1時間以上かかるクエリ(結果はCSVにダンプされる)を実行するように依頼しました。セッションをアクティブに保つために60秒ごとにヌルパケットを送信するようにクライアントに指示しましたが、mysqlクエリ/プロセスが終了する可能性があるので、私の質問は次のとおりです。

  1. (非アクティブのため)キャンセルされたsshセッションは、mysqlクエリプロセスを強制終了しますか?
  2. これが起こらないようにするにはどうすればいいですか?ヌルパケットは60秒ごとに十分に送信されますか?

回答:


9

ほとんどのシェルは、終了時にSIGHUPをフォアグラウンドプロセスグループに送信し(また、一部のバックグラウンドプロセスでは、bashでこれはシェルオプションで制御されますhuponexit)、mysqlクライアントがそれを処理する方法に応じて、死ぬことがあります。

nohupシェルがSIGHUPを送信するかどうかに関係なく、シェルが終了した場合、コマンドの先頭にinitを付けて親を変更することができます(initによって親を変更することは、特にnohupとは関係ありません-それは単に親よりも長生きしているだけです)。

おそらく口に合うソリューションを使用することになりtmuxscreendtachまたはクライアントを実行するのに似ては、あなたのシェルから離れて抽象化し、端末制御します。このように、シェルが切断された場合、クエリを実行していたセッションに再接続するだけです。

一般に、キープアライブパケットは重要ではなく、接続は理由もなく終了することはありません。より差し迫った懸念は、他の理由(ネットワーク障害など)でクライアントとサーバー間の接続が失われることです。


ありがとうございました!わかりやすくするために、mysql内で実際のクエリを実行しています。mysql nohupにログインするときに先頭に追加する限り、内部で実行されているクエリは保持されますか?
NJP

1
@njpインタラクティブに実行したい場合nohup、mysql REPLは端末にアタッチされないため、あまり役に立ちません。代わりに上記のマルチプレクサ(またはdtach)のいずれかを使用してみてください。おそらく、ニーズに合っているでしょう。
クリスダウン

2

私が走り始めましたscreen、私は箱にsshをするとき、部分的にそれを防ぐために、セッションをし、追加ボーナスとして、私は複数のタブを取得し、それを打つことができません。何らかの理由で切断された場合、スクリーンセッションに再接続できます。

更新

#2に答えるにはmysql、bashシェル内からスクリーンセッションを実行します。複雑に聞こえますが、それは次のとおりです。

$: screen
$: mysql

〜/ .screenrcファイルを編集してスクリーンセッションの下部にキャプションを追加すると、タブを追跡したり、タブの名前を変更したりすることができます。

$: screen -d

そして、それはすべての切り離されたセッションを表示します。再接続するには、次のように実行します

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

または、スクリーンセッションのIDが何であれ。中断した場所に戻ってきました。screen -dただし、screenセッションを開始したのと同じユーザー、fyi、またはもちろんルートとして実行する必要があります。私がsshした後は常にsudo su -そうなので、すべてのコマンドをsudoする必要がないので、私は本当にわかりません。


1
使用するアドバイスscreenは適切ですが、OPによってリストされた2つの質問に直接答えることはありません。
バルン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.