Starten Sie mehrere Computer remote neu

11

Ich muss eine Reihe von Computern remote neu starten. Normalerweise stelle ich nur aus

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

Aber ich möchte den Benutzern einige Zeit vor dem Neustart geben. Die SSH-Sitzung wird jedoch nicht getrennt, selbst wenn ich Folgendes verwende:

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

Ich erhalte eine Fehlermeldung:

bash: -c: Zeile 0: Syntaxfehler in der Nähe eines unerwarteten Token- ;' bash: -c: line 0:Sudo-Herunterfahrens -r +5 &; disown '

Irgendwelche Vorschläge?

Horace
quelle
1
Ich sollte hinzufügen, dass ich versuche, den Befehl zum Herunterfahren mit dem "&" in den Hintergrund zu senden. Wenn die Shell das "&" als Befehlstrennzeichen interpretiert, bin ich ratlos, wie ich es in den Hintergrund senden soll, damit der Befehl "disown" funktioniert.
Horace
Der &Charakter sendet den Befehl auf der linken Seite im Hintergrund. So unterscheidet es sich ;.
Kasperd

Antworten:

31

Wie in der Fehlermeldung angegeben, enthält Ihr Befehl einen Syntaxfehler. Dies liegt an der etwas überraschenden Tatsache, dass dies &nicht Teil eines Shell-Befehls ist, sondern ein Trennzeichen zwischen Befehlen (wie es ;ist). Obwohl beide Befehlstrennzeichen sind, &wirkt sich dies zusätzlich auf den Befehl auf der linken Seite aus. Das verwirrt mich sicherlich auch manchmal und ich mache häufig den gleichen Fehler. Sobald Sie es wissen, ist es jedoch einfach zu beheben.

Die Lösung besteht darin, nicht zu schreiben, &;sondern je nach Absicht nur eines der beiden Trennzeichen zu schreiben. (Und in den meisten Fällen, in denen man geschrieben hat, war &;die Absicht, nur zu schreiben &).

Das sollte funktionieren:

ssh server 'sudo shutdown -r +5 & disown'
Kasperd
quelle
7
Sie gewinnen den heutigen Preis dafür, dass Sie mir etwas beigebracht haben, was ich nach 25 Jahren UNIX-Bashing nicht wusste. Auch +1!
MadHatter
Was wäre, wenn er vorhatte, sudo shutdown -r +5 &im Hintergrund zu laufen und dann zu rennen disown? Wie würde Bash mit einer solchen Situation umgehen? Ich würde erwarten, dass dies die perfekte Syntax für einen Befehl ist, selbst wenn &;. Wenn ;es sich um ein Befehlstrennzeichen handelt, haben Sie zwei Befehle zur Hand. Richtig?
Ismael Miguel
1
@IsmaelMiguel Ich verstehe deine Frage nicht. Mit &wird der erste Befehl im Hintergrund gestartet, und sobald der erste Befehl gestartet wurde, wird der zweite Befehl im Vordergrund ausgeführt.
Kasperd
Ich meinte, das sudo shutdown -r +5 &; disownscheint keine schlechte Syntax zu sein. Ich meine, meine Absicht könnte sein, den ersten Teil im Hintergrund und dann den zweiten Teil auszuführen.
Ismael Miguel
@IsmaelMiguel Der Befehlsparser könnte wahrscheinlich erweitert werden, um die leere Zeichenfolge als gültigen Befehl zu betrachten, der immer erfolgreich ist. In diesem Fall sudo shutdown -r +5 &; disownwerden drei gültige Befehle betrachtet, die durch &und getrennt sind ;. Es würde jedoch bedeuten, dass man darauf achten muss, kein zusätzliches Trennzeichen zu verwenden, wenn der vorhandene Status des vorherigen Befehls verwendet werden soll. Es bedeutet , dass man zu achten hat und auf Zeichenüber da zum Beispiel &&und & &wird anders Token versehen.
Kasperd