サーバーの切断/タイムアウト時に ssh (cygwin 経由) がハングするのを防ぐ方法

サーバーの切断/タイムアウト時に ssh (cygwin 経由) がハングするのを防ぐ方法

シナリオ:

ssh user@host
# good connection, do some work...
# stop working, the server has some function where it automatically disconnects ...
# I come back to my cygwin window and it is unresponsive to ctrl + c/z and finally after maybe 2-5 minutes it comes back with the following error message:
Write failed: Connection reset by peer
MyLocalUsername@MyLocalComputer ~
$
# Now I can resume my cygwin session and reconnect.

私の問題は、cygwin がハングアップする様子が気に入らないことです。強制的に閉じたくありませんし、別のウィンドウを開かなければならないのも嫌です (私にとって cygwin を使用する目的は、キーボードを使い続け、ウィンドウに戻って生産性を落とさないことです。つまり、Ctrl + C で作業するか、まったくハングアップしないようにしたいのです)。

答え1

これは私の場合、Windows 8 上の Cygwin64 で動作します:

1) -e "~" で SSH 接続を開始し、エスケープ文字をチルダに設定します。これはデフォルトのエスケープ文字であるはずですが、-e オプションを使用するまで機能しませんでした。どうやら、EscapeChar ~SSH Config でディレクティブを設定することもできるようです。

2) SSH セッションが応答しなくなったら、、、を押しますEnter~実際.に送信するためにチルダを 2 回押す必要がある場合と、そうでない場合があります。多くの場所でそれが必要であると読みましたが、私の場合は 1 回押すだけでうまくいきました。

この回答は次の回答とそのコメントに基づいています:https://superuser.com/a/98565/10167

答え2

ssh コマンドにオプションを追加できます。次を試してください:

ssh -o ServerAliveInterval=30 ユーザー名@ホスト

これにより、ホストから切断されることが防止されます。

答え3

限られたケースに対する解決策を次に示します。切断する関数が明示的に呼び出すことが予測可能なものであり、呼び出し後に正常に終了したいだけであり、このコマンドが切断を引き起こすのに 1 秒以上かかることが分かっている場合は、 との並列呼び出しを使用できます。たとえば、コマンドが切断を引き起こすのに 1 秒以上かかることが確実な場合は、次のように呼び出すことができますnohupsleepexit

nohup <slowcommand> & (sleep 1 && exit)

これにより、次のことが保証されます。

  • slowcommandexit呼び出される前に実行が開始されます
  • slowcommand切断が発生する前にシェルが終了します(slowcommand切断が発生するまでに 1 秒以上かかる場合)
  • slowcommand呼び出しによって終了されないexit

関連情報