私はreboot -f
このコマンドをリモートで使用してUnixシステムを強制的に再起動しています。問題は、SSH接続が長い間アクティブになっているのですが、その理由がわからないということです。 SSH接続を閉じてコンピュータを再起動したら、すぐにローカルシェルに戻りたいです。どうすればいいですか?フラグのない再始動コマンドは-f
何の効果もありません。
答え1
reboot -f
再起動する権限がない限り、コマンドは返されません。このコマンドが実行されると、SSH クライアントは次のようないくつかの操作が実行されるのを待っています。
- SSHサーバーは、表示する出力があるか、リモートコマンドが完了するなど、注意が必要なことが発生したことをクライアントに通知します。
- 中継される信号など、クライアント側で発生したいくつかのイベント
- タイマーが起動し、クライアントに接続保持メッセージを送信させます(またはサーバーが応答しない場合は接続を閉じます)。
SSH サーバー・プロセスが終了したため、タイマーが開始される前に SSH クライアントは終了しません。
次を実行するとssh remotehost 'reboot -f >/dev/null &'
どうなりますか?
- リモートシェルは
reboot
バックグラウンドでコマンドを起動します。 - サーバー側のシェルコマンドが終了し、標準出力ファイル記述子を開いたままにしたプロセスがないため、SSHサーバーは接続を閉じます。
- この
reboot
コマンドを実行すると、マシンが再起動します。
しかし、これは信頼できません。時期によっては、ステップ3がステップ2の前に発生する可能性があります。タイマーを追加すると、これが発生する可能性が低くなります。
ssh remotehost '{ sleep 1; reboot -f; } >/dev/null &'
サーバー側が running でコミットされていることを確実に確認し、同時にコミットされたことをreboot
クライアントに通知する前に実際に再起動しないようにするには、サーバーからクライアントへの追加の通知が必要です。 SSH接続を介して出力できますが、複雑になります。
答え2
私はこの解決策が私にとって最も適していることを知りました。
-o "ServerAliveInterval 2"
次のコマンドと一緒に使用してくださいssh
。
$ ssh -o "ServerAliveInterval 2" root@remotehost reboot
このオプションを有効にすると、クライアントは2秒ごとにセキュアチャネルを介してサーバーへの要求を開始します。結局、再起動が進むにつれて応答が停止し、クライアントの接続が切断されます。
答え3
いくつかの答えは似ていますが、正しい答えは次のとおりです。
ssh [email protected] "nohup sudo reboot &>/dev/null & exit"
説明する:
- 最後のコマンドになりたいので、
exit
最後のコマンドの状態は0(成功)です。必要に応じて睡眠準備を事前に準備できますが、必須ではありません。 - バックグラウンドで再起動を実行する必要があります。それ以外の場合、サーバーは接続を閉じてエラーメッセージを表示します。ほとんどのシステムでは依然として再起動しますが、スクリプトを作成すると、コマンドが正しく実行されても、戻り状態はエラー(ゼロではない)になります。
- バックグラウンドで実行するだけでは十分ではありません。は
stdin
まだstdout
SSH経由で仮想端末に接続されているため、接続は閉じられません。 SSHセッションを終了し、コマンドがバックグラウンドで実行されるようにするには、2つのタスクを実行する必要があります。- 1)SSHセッションを保持している仮想端末によってリダイレクトされないようにリダイレクト
stdout
が必要です。これがまさにこの部分です。stderr
/dev/null
&>/dev/null
stdin
2)読み取れないファイルにも同じ方法でリダイレクトする必要があります。これがシェル内蔵機能がnohup
することです。
- 1)SSHセッションを保持している仮想端末によってリダイレクトされないようにリダイレクト
さまざまな方法で端末から分離されたバックグラウンドでコマンドを実行しなければセッションが閉じられず、exit
仮想端末には何も残っていないため、stdin
SSHstdout
はエラーなしで接続を終了します。
答え4
次を試してみましたか?
# shutdown -r now
私が取り組んだいくつかのシステムでは、再起動コマンドに関するいくつかの問題が見つかりました。その後、-fフラグを使用して再起動するのと同じ操作を実行する終了マンページには何も見つかりません。