複数のマシンをリモートで再起動する


11

リモートでいくつかのマシンを再起動する必要があります。通常は発行するだけです

for host in <hostlist>;do ssh ${host} 'sudo shutdown -r now';done

しかし、再起動する前にユーザーに時間を与えたいです。しかし、それらを使用しても、sshセッションは切断されません:

ssh -f 'sudo shutdown -r +5 &;disown'

エラーメッセージが表示されます。

bash:-c:行0:予期しないトークンの近くで構文エラー;' bash: -c: line 0:sudo shutdown -r +5&; disown '

助言がありますか?


1
「&」でシャットダウンコマンドをバックグラウンドに送信しようとしていることを追加する必要があります。シェルが「&」をコマンド区切り文字として解釈している場合、「disown」コマンドが機能するようにバックグラウンドに送信する方法に困惑しています。
ホレス

&文字は、バックグラウンドで左側にコマンドを送信しません。それがの違いです;
カスペルド

回答:


31

エラーメッセージに示されているように、コマンドに構文エラーがあります。これは&、シェルコマンドの一部ではなく、コマンド間のセパレーターであるという少し驚くべき事実によるものです(;isなど)。どちらもコマンドセパレータです&が、左側のコマンドには追加の効果があります。これは確かに時々私を混乱させます、そして、私はしばしば同じ間違いをします。しかし、一度それを知ってしまえば、簡単に修正できます。

修正するのは、書くの&;ではなく、意図に応じて2つのセパレータのいずれかを書くことです。(そして、書い&;たほとんどの場合、意図は書くだけでした&)。

これは動作するはずです:

ssh server 'sudo shutdown -r +5 & disown'

7
あなたは、UNIXで25年間バッシングした後、私が知らなかったことを教えてくれて、今日の賞を受賞しました。また+1!
マッドハッター

sudo shutdown -r +5 &がバックグラウンドで実行してから実行するつもりだったらどうなるdisownでしょうか?bashはそのような状況をどのように処理しますか?私はこれがコマンドの完璧な構文であると期待しています&;;がコマンド区切り文字の場合、2つのコマンドが手元にあります。正しい?
イスマエルミゲル

1
@IsmaelMiguel質問がありません。を使用&すると、最初のコマンドがバックグラウンドで開始され、最初のコマンドが開始されると、2番目のコマンドがフォアグラウンドで実行されます。
カスペルド

私はそれsudo shutdown -r +5 &; disownが悪い構文のように思えないことを意味しました。つまり、最初の部分をバックグラウンドで実行し、次に2番目の部分を実行することです。
イスマエルミゲル

@IsmaelMiguelコマンドパーサーは、おそらく空文字列を常に成功する有効なコマンドと見なすように拡張できます。その場合sudo shutdown -r +5 &; disownで区切られた3つの有効なコマンドであると考えられる&;。ただし、前のコマンドの存在ステータスを使用する場合は、追加のセパレータを使用しないように注意する必要があることを意味します。これは、1つは、例えば以降にもトークン化に注意を払うに持っていることを意味している&&& &は異なるトークン化されます。
カスペルド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.