web-dev-qa-db-ja.com

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

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

18
coffeMug

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

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

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

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

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

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

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

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

私はこの解決策が私にとって最高のパフォーマンスを発揮することを発見しました。

使用する -o "ServerAliveInterval 2"sshコマンドを使用して、次のようにします。

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

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

6
Roman Saveljev

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

ssh [email protected] "Nohup Sudo reboot &>/dev/null & exit"

説明:

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

すべての方法で端末からデタッチされたバックグラウンドでコマンドのみが実行されている場合、exitはセッションを閉じます。これは、仮想端末SSHにstdinまたはstdoutが残っていないためです。エラーなしで接続を終了します。

5
nachoparker

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

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

これは次のことを行っています:

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

私が見つけた簡単な方法は、シャットダウンと再起動をバックグラウンドタスクとして( '&'を使用して)コマンドを実行し、セッションが 'Nohup'で閉じられたときに、すぐにシェル/セッションが終了するのを防ぐことです。

Nohup shutdown -r now & exit

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

0
MikeW

以下を試しましたか

# shutdown -r now

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

0
Silverrocker

Sshセッションを終了し、次のコマンドを使用してシステムを再起動します。

ssh login@Host "reboot -f"

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

0
Renat Zaripov

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

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

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

0
coffeMug

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

    $ Sudo shutdown +1; logout

これにより、システムのシャットダウンが1分後にスケジュールされます。これにより、ログアウト、つまりSSHの終了が完了するまでの時間を確保できます。できるだけ短い時間で待機したい場合は、+1HH:MM 1日の中で急速に近づいている時間ですが、正確に計時するのは難しい場合があり、最大59秒の遅延がある場合があります。

0
trpropst