SSH経由でログインした状態でサーバーをシャットダウンまたは再起動すると、SSH接続は中断または停止します。端末がまったく応答しなくなり、SSHセッションが切断されたことを認識するのに最大1分かかります。
この問題は新しいDebian 12(openssh-server 1:9.2p1-2)では発生しますが、以前のDebian 10では発生しません。
Debian 10でサーバーを再起動すると、SSH接続はすぐに次のメッセージで完全にログアウトします。
Connection to debian10 closed by remote host.
Connection to debian10 closed.
verboseオプションを使用して両方のサーバーに接続し、再起動したときにいくつかの違いを見つけました。
SSHセッションはきちんと終了します。
$ ssh -vvv -E /tmp/a debian10
debug3: send packet: type 1
debug1: channel 0: free: client-session, nchannels 1
debug3: channel 0: status: The following connections are open:
#0 client-session (t4 r0 i0/0 o0/0 e[write]/0 fd 6/7/8 sock -1 cc -1)
debug3: fd 1 is not O_NONBLOCK
Transferred: sent 4668, received 7428 bytes, in 34.8 seconds
Bytes per second: sent 134.3, received 213.7
debug1: Exit status -1
SSHセッションが停止します。
$ ssh -vvv -E /tmp/b debian12
debug3: send packet: type 80
debug3: receive packet: type 82
debug3: send packet: type 80
debug3: send packet: type 80
debug3: send packet: type 80
Timeout, server debian12 not responding.
同様の質問を見つけましたが、すべての答えはsystemdに関連していると提案しました。私はsystemdを使用せず、両方のサーバーでsysvinitを使用しています。
要約すると、両方のサーバーは同じSSHクライアントを使用して異なる動作をするため、サーバー側にわずかな違いがあると考えられます(おそらくopenssh-serverの動作)。
修正する:
これは私の再起動の順序です(ランレベル6):
/etc/rc6.d/K01cron
/etc/rc6.d/K01ssh
/etc/rc6.d/K01urandom
/etc/rc6.d/K02sendsigs
/etc/rc6.d/K03rsyslog
/etc/rc6.d/K05networking
/etc/rc6.d/K06umountfs
/etc/rc6.d/K07umountroot
/etc/rc6.d/K08reboot
デーモンssh
がnetworking
。ただし、通常のシャットダウンはsshd
既存のSSH接続には影響しないため、影響はありません。
アップデート2:
コンソールに表示される終了順序は次のとおりです。
[ ok Sending processes configured via /etc/ini[....] Stopping: cron
[ ok ] Stopping: sshd
[ ok ] Asking all remaining processes to terminate...done.
[ ok ] All processes ended within 1 seconds...done.
[ ok ] Stopping: rsyslogd
[ ok ] Deconfiguring network interfaces...done.
[ ok ] Will now unmount temporary filesystems: /tmp
[ ok ] Will now unmount local filesystems: /var
[ ok ] Mounting root filesystem read-only...done.
[info] Will now halt.
[79896.954129] reboot: Power down
答え1
根本原因
標準 systemd と sysvinit の場合、順番に終了するとデーモンが終了し、ハードウェアが特定の順序で構成解除されます。特に、IPがまだ生きている間にsshd
22でリッスンしているsshdと、このsshdがbash
生成するさまざまなsshdは、終了するように終了信号を受け取る必要があります。これらの信号を送信した後、IPスタックは少なくとも1秒間状態を維持する必要があります。発生したタイムアウトは、これらのTCPパケットに応答しなくなったサーバーへのオープン接続でクライアントがTCPトラフィックを送信することと一致します。
debian12サーバーで/etc/init.d/rcを確認してください。マルチユーザーランレベル2で変更するときは、プレフィックスK75
などの付いた終了スクリプトを順次実行してデーモンを終了します。ネットワークインターフェイスをシャットダウンする前に、まずsshd
シャットダウンしてください。ifconfig
他の2桁のシーケンス番号を使用するようにスクリプトの名前を変更すると、実行順序が変更されます。
sleep
スクリプトが互いに競合している場合は、一時ステートメントを挿入するとスクリプトが遅くなる可能性があります。
固定する
システムログの小さな初期化スクリプトの曲がりくねった迷路を見るのが難しい場合でも、いくつかの簡単な解決策があります。
簡単なshutdown -r +1
ルートアクセスを使用すると、花火が始まる前にCTRL-Dを押してsshから正常に切断できる60秒の時間が得られます。
このようなコマンドを使用すると、(sleep 5 && reboot) &
これを短時間で完了できます。する必要があるかもしれません
北面
または、disown
ptyのジョブ制御からバックグラウンドプロセスを分離します。したがって、このコマンドの短いスクリプトを作成すると便利です。
私たちに教えてください 変更すべき詳細あなたのシステム。
答え2
構成を確認し/etc/ssh/sshd_config
、UsePAM yes
パッケージがインストールされていることを確認してください。libpam-systemd
dbus
systemd-logindは、ローカルおよびリモート(ssh)アクティブユーザーセッションの記録を維持し、生成されたプロセスをユーザー「スライス」に割り当てます。 systemdが停止したときに正しく設定されている場合は、SSH接続を含める必要があるネットワーク接続を無効にする前に、ユーザースライス内のすべてのエントリに対してSIGTERMを実行してください。