riavviare più macchine in remoto


11

Devo riavviare un numero di macchine in remoto. Normalmente ho solo problema

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

Ma voglio concedere agli utenti un po 'di tempo prima del riavvio. Comunque la loro sessione ssh non si disconnetterà anche se uso:

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

Viene visualizzato un messaggio di errore:

bash: -c: riga 0: errore di sintassi vicino token imprevisto ;' bash: -c: line 0:sudo shutdown -r +5 &; disown '

Eventuali suggerimenti?


1
Dovrei aggiungere che sto cercando di inviare il comando di arresto in background con "&". Se la shell sta interpretando "&" come un separatore di comandi, allora sono sconcertato su come inviarlo in background in modo che il comando "disown" funzioni.
Orazio

Il &personaggio invia il comando sul lato sinistro in background. È così che differisce da ;.
Kasperd,

Risposte:


31

Come indicato dal messaggio di errore, hai un errore di sintassi nel tuo comando. È dovuto al fatto leggermente sorprendente che &non fa parte di un comando shell ma piuttosto di un separatore tra comandi (come ;è). Sebbene entrambi siano separatori di comandi &ha un effetto aggiuntivo sul comando sul lato sinistro. Questo certamente mi confonde anche a volte, e spesso commetto lo stesso errore. Una volta che lo sai, è comunque facile da risolvere.

La correzione è non scrivere &;ma piuttosto scrivere uno dei due separatori a seconda delle tue intenzioni. (E nella maggior parte dei casi in cui uno ha scritto &;l'intenzione era solo quella di scrivere &).

Questo dovrebbe funzionare:

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

7
Hai vinto il premio di oggi per avermi insegnato qualcosa che non sapevo dopo 25 anni di bashing su UNIX. Anche +1!
MadHatter,

E se avesse intenzione di eseguire sudo shutdown -r +5 &in background e quindi eseguire disown? Come potrebbe bash gestire tale situazione? Mi aspetto che questa sia una sintassi perfetta per un comando, anche se lo è &;. Se ;è un separatore di comandi, allora hai 2 comandi tra le mani. Giusto?
Ismael Miguel,

1
@IsmaelMiguel Non capisco la tua domanda. L'utilizzo &avvierà il primo comando in background e una volta avviato il primo comando, il secondo comando verrà eseguito in primo piano.
Kasperd,

Volevo dire che sudo shutdown -r +5 &; disownnon sembra una cattiva sintassi. Voglio dire, la mia intenzione potrebbe essere quella di eseguire la prima parte in background e poi la seconda parte.
Ismael Miguel,

@IsmaelMiguel Il parser dei comandi potrebbe essere probabilmente esteso per considerare la stringa vuota come un comando valido che ha sempre esito positivo. In tal caso sudo shutdown -r +5 &; disownsarebbero considerati tre comandi validi separati da &e ;. Significherebbe comunque che bisogna fare attenzione a non usare un separatore aggiuntivo se si deve usare lo stato esistente del comando precedente. Significa che si deve prestare attenzione alla creazione di token pure poiché per esempio &&e & &ottiene token in modo diverso.
Kasperd,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.