Autosshを30秒のポーリング時間で開始しました。
AUTOSSH_POLL=30 AUTOSSH_LOGLEVEL=7 autossh -M 0 -f -S none -f -N -L localhost:34567:localhost:6543 user1@server1
そしてそれはうまくいきます:
Sep 5 12:26:44 serverA autossh[20935]: check on child 23084
Sep 5 12:26:44 serverA autossh[20935]: set alarm for 30 secs
しかし、ネットワークケーブルを物理的に取り外した場合、つまりトンネルが機能しなくなった場合、autosshはsshデーモンを強制終了しません。どうして?リンクがダウンしている場合、autosshは何もできないことを理解していますが、私の意見では、次のことを実行する必要があります。
check on child ...
)それが私がautosshを実行している理由です。トンネルに何かが起こった場合(ソフトウェアまたはハードウェアの問題である場合)は、トンネルを再起動する必要があります。代わりに、sshプロセスが終了するのを待っています。接続を再確立する見込みがない場合でも、再起動しようとしているのではないですか?
Autosshはどのようなチェックを行っていますか? sshが稼働していることを確認してください。遠端のチェックを行っていませんか?
要求に応じて、ssh構成の関連部分を追加します。
# (see http://aaroncrane.co.uk/2008/04/ssh_faster)
# The ServerAliveInterval tells SSH to send a keepalive message every 60 seconds while the connection is open;
# that both helps poor-quality NAT routers understand that the NAT table entry for your connection should
# be kept alive, and helps SSH detect when there’s a network problem between the server and client.
ServerAliveInterval 60
# The ServerAliveCountMax says that after 60 consecutive unanswered keepalive messages, the connection should
# be dropped. At that point, AutoSSH should try to invoke a fresh SSH client. You can Tweak those
# specific values if you want, but they seem to work well for me.
ServerAliveCountMax 60
TCPKeepAlive yes
しかし、ネットワークケーブルを物理的に取り外した場合、つまりトンネルが機能しなくなった場合、autosshはsshデーモンを強制終了しません。どうして?
autosshはクライアントマシン上で実行されるため、サーバー上のsshデーモンプロセスを直接強制終了することはできません。ただし、サーバーの/etc/ssh/sshd_config
でClientAliveInterval
にゼロ以外の値を指定し(man sshd_config
を参照)、サーバーのsshdサービスを再起動して構成の変更を適用できます。次に、ネットワークが切断された場合、sshデーモンプロセスはClientAliveInterval * ClientAliveCountMax
秒後に強制終了されます(ただし、autosshによるものではありません)。
ここで、"autosshがsshクライアントプロセスを強制終了しないのはなぜですか?"と尋ねた場合、-M 0
を指定しました。 autosshのmanページから:
Setting the monitor port to 0 turns the monitoring function off, and autossh will only restart ssh upon ssh's exit
。
Autosshを使用して接続を監視する代わりに、ServerAliveCountInterval * ServerAliveCountMax
秒のタイムアウト後にsshが終了するのを待っています。 sshが終了する前に60のサーバーアライブチェックをリクエストしました。連続するチェックは60秒の間隔で区切られているため、sshクライアントが終了するまで1時間待機します。
また、クライアント側でExitOnForwardFailure
オプションを使用することを検討することもできます(man ssh_config
を参照)。これにより、トンネルを確立できない場合にsshが終了し、autosshがsshの再起動を試みることができます。