reinicie várias máquinas remotamente

11

Preciso reiniciar várias máquinas remotamente. Normalmente eu apenas emito

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

Mas quero dar aos usuários algum tempo antes do reinício. No entanto, a sessão ssh não será desconectada, mesmo que eu use:

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

Recebo uma mensagem de erro:

bash: -c: linha 0: erro de sintaxe próximo ao token inesperado ;' bash: -c: line 0:sudo shutdown -r +5 &; disown '

Alguma sugestão?

Horace
fonte
1
Devo acrescentar que estou tentando enviar o comando shutdown para segundo plano com o "&". Se o shell estiver interpretando o "&" como um separador de comandos, então eu estou confuso sobre como enviá-lo para segundo plano, para que o comando "renegado" funcione.
Horace
O &personagem envia o comando no lado esquerdo em segundo plano. É assim que difere ;.
kasperd

Respostas:

31

Conforme indicado pela mensagem de erro, você tem um erro de sintaxe em seu comando. Isso se deve ao fato de que &não faz parte de um comando do shell, mas um separador entre os comandos (como ;é). Embora ambos sejam separadores de comando, isso &tem um efeito adicional no comando no lado esquerdo. Isso certamente também me confunde às vezes, e freqüentemente eu cometo o mesmo erro. Depois que você souber, é fácil corrigi-lo.

A solução é não escrever, &;mas sim escrever um dos dois separadores, dependendo da sua intenção. (E na maioria dos casos em que alguém escreveu, &;a intenção era apenas escrever &).

Isso deve funcionar:

ssh server 'sudo shutdown -r +5 & disown'
Kasperd
fonte
7
Você ganhou o prêmio de hoje por me ensinar algo que eu não sabia depois de 25 anos bashing no UNIX. Também +1!
MadHatter
E se ele pretendesse executar sudo shutdown -r +5 &em segundo plano e depois executar disown? Como o bash lidaria com essa situação? Eu esperaria que esta seja uma sintaxe perfeita para um comando, mesmo tendo &;. Se ;é um separador de comandos, você tem 2 comandos em suas mãos. Certo?
Ismael Miguel
1
@IsmaelMiguel Não recebo sua pergunta. O uso &iniciará o primeiro comando em segundo plano e, uma vez iniciado o primeiro comando, o segundo comando será executado em primeiro plano.
kasperd
Eu quis dizer que sudo shutdown -r +5 &; disownisso não parece ser uma sintaxe ruim. Quero dizer, minha intenção poderia ser executar a primeira parte em segundo plano e depois a segunda parte.
Ismael Miguel
@IsmaelMiguel O analisador de comandos provavelmente pode ser estendido para considerar a string vazia como um comando válido que sempre é bem-sucedido. Nesse caso, sudo shutdown -r +5 &; disownseriam considerados três comandos válidos separados por &e ;. No entanto, isso significa que é preciso ter cuidado para não usar um separador adicional se o status existente do comando anterior for usado. Isso significa que é preciso prestar atenção à tokenização, já que, por exemplo, &&e a & &tokenização é diferente.
kasperd