リモートでreboot -f
コマンドを使用して、Unixマシンを強制的に再起動しています。問題は、ssh接続が長期間アクティブなままであり、その理由がわからないことです。マシンを再起動した直後にssh接続を閉じて、ローカルシェルに戻りたいのですが。どうやってやるの? -f
フラグのないrebootコマンドは機能しないことに注意してください。
コマンドreboot -f
は決して戻りません(再起動を行う権限がない場合を除きます)。発行された時点で、SSHクライアントは何かが行われるのを待っています。
SSHサーバープロセスが停止しているため、タイマーが起動するまでSSHクライアントは停止しません。
ssh remotehost 'reboot -f >/dev/null &'
を実行すると、次のようになります。
reboot
コマンドをバックグラウンドで起動します。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秒ごとに安全なチャネルを介してサーバーをポークします。最終的に再起動が進むと、応答が停止し、クライアントは接続を切断します。
いくつかの答えは近いものでしたが、正しい答えは次のとおりです。
ssh [email protected] "Nohup Sudo reboot &>/dev/null & exit"
説明:
exit
をしたいので、最後のコマンドのステータスは0(成功)です。必要に応じて睡眠を付加することができますが、それは必要ではありませんstdin
とstdout
はSSHを介して仮想端末に接続されているため、バックグラウンドで実行するだけでは十分ではなく、接続は閉じられません。 SSHセッションを終了して、コマンドをバックグラウンドで実行したままにするには、さらに2つのことを行う必要があります。stdout
およびstderr
を/dev/null
にリダイレクトして、SSHセッションを保持する仮想端末によってリダイレクトされないようにする必要があります。これは&>/dev/null
の部分です。stdin
を読み取り不可能なファイルにリダイレクトする必要があります。これは、シェル組み込みNohup
が行うことです。すべての方法で端末からデタッチされたバックグラウンドでコマンドのみが実行されている場合、exit
はセッションを閉じます。これは、仮想端末SSHにstdin
またはstdout
が残っていないためです。エラーなしで接続を終了します。
次のコマンドを使用します。
ssh -t <hostname> 'Sudo shutdown --reboot 0 && exit'
これは次のことを行っています:
私が見つけた簡単な方法は、シャットダウンと再起動をバックグラウンドタスクとして( '&'を使用して)コマンドを実行し、セッションが 'Nohup'で閉じられたときに、すぐにシェル/セッションが終了するのを防ぐことです。
Nohup shutdown -r now & exit
このように、リモートシステムが非同期で再起動を続行している間、セッションはすぐに終了するため、SSHクライアントはハングしません。
以下を試しましたか
# shutdown -r now
パスで作業した一部のシステムでは、rebootコマンドに問題があったことがわかりました。次に、シャットダウンのマンページで、-fフラグを指定して再起動するのと同じことを行うものは何も見つかりません。
Sshセッションを終了し、次のコマンドを使用してシステムを再起動します。
ssh login@Host "reboot -f"
この後、Ctrl + Cを押してsshを終了します。
他の人にも役立つかもしれないこの解決策を見つけました。次のコマンドを使用して、sshにアタッチされたコマンドを開始した直後に接続を閉じました。
ssh Host "command to run on the Host machine > /dev/null &"
このコマンドが接続を強制的に閉じる理由を正確には理解していませんが、少なくとも私にとっては役に立ちました。 ssh接続が強制終了される理由を誰かが理解している場合。説明してください。
これには1分の遅延が必要ですが、私にとっては確実に機能し、SSHクライアントがハングする問題を解決しています。
$ Sudo shutdown +1; logout
これにより、システムのシャットダウンが1分後にスケジュールされます。これにより、ログアウト、つまりSSHの終了が完了するまでの時間を確保できます。できるだけ短い時間で待機したい場合は、+1
とHH:MM
1日の中で急速に近づいている時間ですが、正確に計時するのは難しい場合があり、最大59秒の遅延がある場合があります。