Necesito reiniciar varias máquinas de forma remota. Normalmente solo publico
for host in <hostlist>;do ssh ${host} 'sudo shutdown -r now';done
Pero quiero darles a los usuarios algo de tiempo antes del reinicio. Sin embargo, la sesión ssh no se desconectará incluso si uso:
ssh -f 'sudo shutdown -r +5 &;disown'
Recibo un mensaje de error:
bash: -c: línea 0: error de sintaxis cerca del token inesperado
;' bash: -c: line 0:
sudo shutdown -r +5 &; disown '
¿Alguna sugerencia?
&
personaje envía el comando en el lado izquierdo en el fondo. Así es como difiere de;
.Respuestas:
Como lo indica el mensaje de error, tiene un error de sintaxis en su comando. Se debe al hecho ligeramente sorprendente de que
&
no es parte de un comando de shell sino más bien un separador entre comandos (como;
es). Aunque ambos son separadores de comandos,&
tiene un efecto adicional sobre el comando en su lado izquierdo. Esto ciertamente también me confunde a veces, y frecuentemente cometo el mismo error. Una vez que lo sabes, es fácil de arreglar.La solución es no escribir,
&;
sino simplemente escribir uno de los dos separadores dependiendo de su intención. (Y en la mayoría de los casos en los que uno ha escrito,&;
la intención era solo escribir&
).Esto debería funcionar:
fuente
sudo shutdown -r +5 &
en segundo plano y luego correrdisown
? ¿Cómo manejaría bash tal situación? Esperaría que esta sea la sintaxis perfecta para un comando, incluso teniendo&;
. Si;
es un separador de comandos, entonces tiene 2 comandos en sus manos. ¿Derecho?&
iniciará el primer comando en segundo plano y una vez que se haya iniciado el primer comando, el segundo comando se ejecutará en primer plano.sudo shutdown -r +5 &; disown
no parece una mala sintaxis. Quiero decir, mi intención podría ser ejecutar la primera parte en segundo plano y luego la segunda parte.sudo shutdown -r +5 &; disown
se considerarían tres comandos válidos separados por&
y;
. Sin embargo, significaría que hay que tener cuidado de no usar un separador adicional si se va a utilizar el estado existente del comando anterior. Lo que significa es que uno tiene que prestar atención a tokenizar, así ya que, por ejemplo,&&
y& &
consigue tokenizados diferente.