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?
&
personagem envia o comando no lado esquerdo em segundo plano. É assim que difere;
.Respostas:
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:
fonte
sudo shutdown -r +5 &
em segundo plano e depois executardisown
? 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?&
iniciará o primeiro comando em segundo plano e, uma vez iniciado o primeiro comando, o segundo comando será executado em primeiro plano.sudo shutdown -r +5 &; disown
isso 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.sudo shutdown -r +5 &; disown
seriam 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.