Debianとsshdを実行するサーバーがあり、サーバーを再起動する必要がある場合、TCPタイムアウトまでクライアント側でSSHセッションがハングします。これは、sshd終了時にホストへの開いているSSHセッションを明示的に閉じないためだと思います。sshd最初に全員を切断してから、通常どおりに終了するにはどうすればよいですか?これまでのところman sshd_config、shutsown動作に関連するパラメーターは表示されません。
Debianとsshdを実行するサーバーがあり、サーバーを再起動する必要がある場合、TCPタイムアウトまでクライアント側でSSHセッションがハングします。これは、sshd終了時にホストへの開いているSSHセッションを明示的に閉じないためだと思います。sshd最初に全員を切断してから、通常どおりに終了するにはどうすればよいですか?これまでのところman sshd_config、shutsown動作に関連するパラメーターは表示されません。
回答:
システムをシャットダウンまたは再起動するsystemdと、すべてのサービスをできるだけ早く停止しようとします。それには、ネットワークを停止し、まだ稼働しているすべてのプロセスを通常はその順序で終了することが含まれます。したがって、systemdがSSHセッションを処理しているフォークされたSSHプロセスを強制終了すると、ネットワーク接続はすでに無効になり、クライアント接続を正常に閉じる方法がなくなります。
あなたの最初の考えは、シャットダウン中の最初のステップとしてすべてのSSHプロセスを強制終了することかもしれません。それを行うsystemdサービスファイルがたくさんあります。
しかし、もちろんすてきな解決策があります(どのように「想定」されるか)systemd-logind。
systemd-logindアクティブなユーザーセッション(ローカルおよびSSHセッション)を追跡し、その中で生成されるすべてのプロセスをいわゆる「スライス」に割り当てます。このように、システムがシャットダウンされると、systemdはユーザースライス(特定のセッションを処理するフォークされたSSHプロセスを含む)内のすべてをSIGTERMし、サービスとネットワークのシャットダウンを続行できます。
systemd-logind新しいユーザーセッションの通知を受け取るにはPAMモジュールが必要であり、そのステータスを確認するdbusために使用loginctlする必要があるため、これらの両方をインストールします。
apt-get install libpam-systemd dbus
/etc/ssh/sshd_configで実際にモジュールを使用することを確認してくださいUsePAM yes。
reboot、shutdown -rデフォルトで1分の遅延を設定し、SSHセッションを閉じる時間を確保します。
これは、サーバー側ではなく、クライアント側で設定する必要があるものです。~/.ssh/configを含むように編集
ServerAliveInterval 15
ServerAliveCountMax 5
これは、非アクティブな状態が15秒間続くと、クライアントがサーバーにメッセージを送信することを意味します。応答が得られない場合は、最大5回再試行し、それでも応答が得られない場合は、セッションを閉じます。
この動作はこのDebian Bugで報告されています。パッケージに同梱されているシャットダウンスクリプトは、デフォルトでは自動的にコピーされないため、正しくセットアップするだけです。
cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl enable ssh-session-cleanup.service
次のように、1つのsshコマンドに対して、ジェニーDが答えで語ったオプションを指定できます。
ssh -t -o ServerAliveInterval=1 -o ServerAliveCountMax=1 user@host sudo poweroff
頻繁に行う場合は、スクリプトを作成できます。
悲しいことに、serverfaultは私にスレッドの原因を何年も前から少なからず答えさせませんでした。しかし、ロックを解除するために他のブログでスパムする必要はありません^^ ...
Rfraileが述べたように
cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl enable ssh-session-cleanup.service
動作します。インスタンス/サーバーを再起動せずに使用するには、追加のタスクを実行する必要があります。
systemctl daemon-reload
systemctl start ssh-session-cleanup.service
そのため、サービスは登録および開始され、再起動/シャットダウンの目的でsystemdがサービスを停止する必要があります。