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?
&
Charakter sendet den Befehl auf der linken Seite im Hintergrund. So unterscheidet es sich;
.Antworten:
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:
quelle
sudo shutdown -r +5 &
im Hintergrund zu laufen und dann zu rennendisown
? 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?&
wird der erste Befehl im Hintergrund gestartet, und sobald der erste Befehl gestartet wurde, wird der zweite Befehl im Vordergrund ausgeführt.sudo shutdown -r +5 &; disown
scheint keine schlechte Syntax zu sein. Ich meine, meine Absicht könnte sein, den ersten Teil im Hintergrund und dann den zweiten Teil auszuführen.sudo shutdown -r +5 &; disown
werden 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.