SSH:対話型セッション中にランダムに「リモートホストによって接続が閉じられました」

SSH:対話型セッション中にランダムに「リモートホストによって接続が閉じられました」

私はOpenFOAM計算流体力学ライブラリを使用して数値シミュレーションを実行するリモートサーバーで作業しています。パラメータの研究を自動化するために一連のPythonスクリプトを構築しましたが、うまくいくようです。

SSHを使用してサーバーに接続し、対話型シェルでスクリプトを実行します。時々まだ認識されていない状況では、サーバーがSSHセッションを閉じる可能性があります。現在、回避策としてウィンドウマネージャを使用していますが、screenそれでも問題になります。以下は私が得た出力の例です。

<lots of output before that>
Dumping up_half1 faces to "final_up_half1.obj"
Dumping cyclic match as lines between face centres to "final_up_half0up_half1_match.obj"
Writing repatched mesh to 0

End

Killing PID 32536
Connection to hpc4 closed by remote host.
Connection to hpc4 closed.
➜  ~

シミュレーションはまだ完了していません。画面上のアプリケーションの印刷が終了したら、End他のアプリケーションを起動していくつかの処理を実行する必要があります。

だから質問はこんな感じです。このような切断の原因は何ですか?

答え1

を使用すると、サーバーの切断の問題を回避できますnohupnohupサーバーでコマンドを実行すると、サーバーが切断されても引き続き実行されます。コマンドの標準出力をnohup.outというファイルに保存しますが、必要に応じてリダイレクトできます。例えば、

nohup ./simulation > output.txt &

実行され./simulation、通常は画面に印刷される出力をoutput.txtに入れます。 SSH接続が失われても、./simulation完了するまで実行され続けます。

答え2

ランダム推測:

あなたのコンピュータには問題はありませんが、TCP接続を追跡するファイアウォールで「保護された」ネットワークにあります。ファイアウォールは、接続が長時間アイドル状態であることを検出すると、接続が切断されたと見なします。これは、ファイアウォールがその接続に属するTCPセグメントを渡すのが悪いと思うことを意味します。ファイアウォールの観点からは、そのセグメントはどの接続にも属さない可能性があり、SSHセッションは最終的にタイムアウトするためです。

この状況を解決するには、SSH クライアントが時々 null セグメントを送信して、リモートホストにアクティブなセッションがあることをファイアウォールに通知するようにします。ServerAliveInterval説明されているオプションを使用してこれを実行できます。ここ

画面を使用するとき:同じ問題が一度ありましたが、ハードステータスバーに時計を追加したときに誤って問題を解決しました。これにより、画面は1分ごとに自動的にハードステータスバーを更新します。

これを行うための最低限の努力は~/.screenrc次のとおりです。

hardstatus alwayslastline
hardstatus string '%=[%Y-%m-%d %c ]'

(で採用レッドハットマガジン)

関連情報