sshコマンドを使用して再起動を実行した後に接続を閉じる


18

reboot -fコマンドをリモートで使用して、Unixマシンを強制的に再起動しています。問題は、ssh接続が長時間アクティブのままであるということですが、その理由はわかりませんか?マシンを再起動した直後にssh接続を閉じて、ローカルシェルに戻りたい。どうやってやるの?-fフラグなしの再起動コマンドは機能しないことに注意してください。


1
リモート接続(Ctrl + D)を終了し、シェルプロンプトを見ずにサーバーを再起動してみませんか?
gertvdijk

同じコマンドでこれを行うにはどうすればよいですか?
coffeMug

2
他の人にも役立つかもしれないこの解決策を見つけました。次のコマンドを使用して、sshに接続されたコマンドを開始した直後に接続を閉じました。ssh host "ホストマシンで実行するコマンド> / dev / null&"終了しましたが、少なくとも私にとっては役に立ちました。コマンドの出力を/ dev / nullに送信することと、それがssh接続を強制終了する理由を理解している人がいる場合は、説明できると便利です。:-)
coffeMug

sshホスト「ホストマシンで実行するコマンド> / dev / null&」
coffeMug

1
これはこの質問に対する答えではありませんが、とにかく知っておくと便利です。SSHクライアントには、クライアントを強制終了するために使用できる一連の制御文字があります。制御文字は改行の直後にのみ認識されるため、を押して開始しますEnter。次に、たとえば~.セッションを終了します。 Enter ~?他のリスト。
トム

回答:


22

コマンドreboot -fが返されることはありません(再起動を行う権限がない場合を除く)。それが発行された時点で、SSHクライアントは何かするのを待っています。

  • SSHサーバーは、注意が必要な何かが発生したことをクライアントに通知します。たとえば、表示する出力がある、リモートコマンドが終了したなどです。
  • 中継する信号など、クライアント側のイベント。
  • クライアントがキープアライブメッセージを送信するようにタイマーを起動します(サーバーが応答しない場合は接続を閉じます)。

SSHサーバープロセスは停止しているため、SSHクライアントはタイマーが起動するまで停止しません。

を実行するとssh remotehost 'reboot -f >/dev/null &'、次のようになります。

  1. リモートシェルrebootはバックグラウンドでコマンドを起動します。
  2. サーバー側シェルコマンドが終了し、標準出力のファイル記述子を開いているプロセスがないため、SSHサーバーは接続を閉じます。
  3. このrebootコマンドにより、マシンが再起動します。

ただし、これは信頼できません。タイミングによっては、ステップ3がステップ2の前に発生する場合があります。タイマーを追加すると、これが起こりにくくなります。

ssh remotehost '{ sleep 1; reboot -f; } >/dev/null &'

サーバー側が実行されていることを完全に確認すると同時に、クライアントにコミットされたrebootことを通知する前に実際に再起動しないことを確認するには、サーバーからクライアントに移動するための追加の通知が必要です。これはSSH接続を介して出力できますが、複雑になります。


2
場合には誰もが、リモートホスト(同様のソリューション)の中からこれを行う方法を探しています:(sleep 1 && sudo reboot &) && exit。括弧はサブプロセスを生成し、1秒待ってから再起動を開始します。ただし、ホストプロセスはsshセッションを直ちに終了します。私はシェルの第一人者ではありませんが、これは今のところうまくいきました。
Griddo

@Griddoそれは素晴らしく機能し、きちんとした小さなハックです。大好きです。共有してくれてありがとう!
ジョシュアピンター

5

私はこのソリューションが私にとって最高のパフォーマンスを発揮することを発見しました。

次のようにコマンドで使用-o "ServerAliveInterval 2"しますssh

$ ssh -o "ServerAliveInterval 2" root@remotehost reboot

上記のオプションにより、クライアント側は2秒ごとに安全なチャネルでサーバーを突くことができます。最終的に再起動が進むと、再起動は停止し、クライアントは接続を切断します。


おかげでローマ、魔法のように動作します!:)
stdcerr

3

いくつかの答えは近かったですが、正しい答えは次のとおりです。

ssh user@192.168.0.130 "nohup sudo reboot &>/dev/null & exit"

説明:

  • exit最後のコマンドのステータスが0(成功)になるように、最後のコマンドにしたい。必要に応じて睡眠を追加できますが、必須ではありません
  • サーバーが接続を閉じてエラーが発生するため、バックグラウンドで再起動を実行する必要があります。ほとんどのシステムでリブートしますが、スクリプトを実行している場合、コマンドが正しく実行されていても戻りステータスはエラー(0ではない)になります
  • stdinstdoutはまだSSH経由で仮想端末に接続されているため、バックグラウンドで実行するだけでは十分ではないため、接続は閉じられません。SSHセッションを終了し、コマンドをバックグラウンドで実行したままにするには、さらに2つのことを行う必要があります。
    • 1)あなたは、リダイレクトする必要があるstdoutstderr/dev/nullそれらはSSHセッションを保持している仮想端末によってリダイレクトされないように。これは&>/dev/null一部です。
    • 2)stdin同じ方法で読めないファイルにリダイレクトする必要があります。それがシェルの組み込みnohup機能です。

バックグラウンドで実行されるコマンドのみが端末から切り離さexitれると、セッションが閉じられ、仮想端末が存在しないstdinstdout残っているため、SSHはエラーなしで接続を終了します。


1

次のコマンドを使用します。

ssh -t <hostname> 'sudo shutdown --reboot 0 && exit'

これが何をしているのかです:

  • マシンに次の瞬間に再起動するように指示しますが、このコマンド中には再起動しません
  • SSHから正常に終了します
  • SSH TTYをずっと維持するので、sudoは満足して適切に実行できます。

0

以下を試してみましたか

# shutdown -r now

パスで作業した一部のシステムでは、再起動コマンドにいくつかの問題がありました。再度、シャットダウンのマンページに-fフラグを指定してリブートするのと同じことをするものが見つかりません。


1
はい、いくつかの奇妙な理由で、接続しようとしているマシンでシャットダウンが機能しません。そのため、再起動-fを使用して強制的にシャットダウンして再起動します。
coffeMug

0

次のコマンドを使用してsshセッションを終了し、システムを再起動してください:

ssh login@host "reboot -f"

この後、Ctrl + Cを押してsshを終了します。


0

他の人にも役立つかもしれないこの解決策を見つけました。次のコマンドを使用して、sshに接続されたコマンドを開始した直後に接続を閉じました。

ssh host "command to run on the host machine > /dev/null &"

このコマンドが接続を強制的に閉じる理由を正確には理解していませんが、少なくとも私にとっては役に立ちました。誰かがssh接続を切断する理由を理解している場合; 説明してください。


0

これには1分の遅延が必要ですが、私にとっては確実に機能し、SSHクライアントがハングする問題を解決しました。

    $ sudo shutdown +1; logout

これにより、システムのシャットダウンが1分間スケジュールされ、ログアウト、つまりSSH終了が完了するまでの時間が確保されます。できるだけ短い時間待機したい場合は、時間を短くするために+1を置き換えることができますが、HH:MM時間を正確に調整するのは難しく、最大59秒の遅延が生じる可能性があります。


0

私が見つけた簡単な方法は、シャットダウン/リブートをバックグラウンドタスクとしてコマンドし(「&」を使用)、セッションが「nohup」で閉じられたときに閉じられるのを防ぎ、すぐにシェル/セッションを終了します:

nohup shutdown -r now & exit

この方法では、リモートシステムが非同期でリブートを続行している間にセッションがすぐに終了するため、SSHクライアントはハングしません。


または、システムの「shutdown -r now」に相当するものを再起動に置き換えてください
....-MikeW

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.