シャットダウン/再起動時にSSHセッションがハングする


13

Debianとsshdを実行するサーバーがあり、サーバーを再起動する必要がある場合、TCPタイムアウトまでクライアント側でSSHセッションがハングします。これは、sshd終了時にホストへの開いているSSHセッションを明示的に閉じないためだと思います。sshd最初に全員を切断してから、通常どおりに終了するにはどうすればよいですか?これまでのところman sshd_config、shutsown動作に関連するパラメーターは表示されません。


他のすべてが失敗した場合、[Enter] [〜] [。]を押すことで、いつでもSSHクライアントを強制終了できます。同様にあなたの問題を実際に解決する方法の説明。
n.st

回答:


32

システムをシャットダウンまたは再起動する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


さて、目標を達成し、説明をありがとう。(自分の仕事を終えることができながら、すべてが最初SIGTERM'dがあるので、私は、シャットダウンの依存コントロールのいくつかの方法が欲しいが、これは階層化ソリューションとして行うことができます。)
ヴェスパー

何らかの理由で、StackOverflowのみにアクセスしている間、回答について通知されませんでした。奇妙な。
ヴェスパー

1
要するに、シャットダウン時に数秒を削るだけで、接続を適切に終了させるために、大量のがらくたをインストールする必要がありますか?マジ?これはひどいです。私たちは運命です。
ロイコス

3
libpam-systemdとdbusをインストールした後、最初にリブートすると、SSHセッションがハングしたままになることに注意してください。これを回避するには、の代わりにrebootshutdown -rデフォルトで1分の遅延を設定し、SSHセッションを閉じる時間を確保します。
mivk

9

これは、サーバー側ではなく、クライアント側で設定する必要があるものです。~/.ssh/configを含むように編集

ServerAliveInterval 15
ServerAliveCountMax 5

これは、非アクティブな状態が15秒間続くと、クライアントがサーバーにメッセージを送信することを意味します。応答が得られない場合は、最大5回再試行し、それでも応答が得られない場合は、セッションを閉じます。


2
これにより、sshクライアントがサーバーの停止を報告するまでに75秒の遅延が生じます。正しい?
ヴェスパー

1
はい、パラメータを調整してタイムアウトを短くすることができます。
テロキルカネン

これで問題は解決しました。そのような刺激的な問題。
ジャスティンアンドラスク

5

この動作はこのDebian Bugで報告されています。パッケージに同梱されているシャットダウンスクリプトは、デフォルトでは自動的にコピーされないため、正しくセットアップするだけです。

cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl  enable ssh-session-cleanup.service

1

次のように、1つのsshコマンドに対して、ジェニーDが答えで語ったオプションを指定できます。

ssh -t -o ServerAliveInterval=1 -o ServerAliveCountMax=1 user@host sudo poweroff

頻繁に行う場合は、スクリプトを作成できます。


0

lshdで動作します。だから解決策は

apt install lsh-server
apt remove openssh-server

0

悲しいことに、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がサービスを停止する必要があります。


それでは、別の答えを繰り返しているだけですか?
-RalfFriedl

番号?まだ書かれたとおりに返信できないため、2行を上位の返信の参照としてのみ使用しました。再起動せずに使用するために必要な手順を追加しました。これは別の質問スレッドでも示されますが、私はまだチェックアウトしていません。
Reiner030
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.