redémarrer plusieurs machines à distance

11

Je dois redémarrer un certain nombre de machines à distance. Normalement, je viens d'émettre

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

Mais je veux donner aux utilisateurs un peu de temps avant le redémarrage. Cependant, leur session ssh ne se déconnectera pas même si j'utilise:

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

Je reçois un message d'erreur:

bash: -c: ligne 0: erreur de syntaxe près de l' ;' bash: -c: line 0:arrêt inattendu du sudo du jeton -r +5 &; disown '

Aucune suggestion?

Horace
la source
1
Je dois ajouter que j'essaie d'envoyer la commande d'arrêt en arrière-plan avec le "&". Si le shell interprète le "&" comme un séparateur de commandes, je suis perplexe quant à la façon de l'envoyer en arrière-plan afin que la commande "désavouer" fonctionne.
Horace
Le &personnage envoie la commande sur le côté gauche en arrière-plan. C'est en quoi cela diffère ;.
kasperd

Réponses:

31

Comme indiqué par le message d'erreur, vous avez une erreur de syntaxe dans votre commande. Cela est dû au fait légèrement surprenant qui &ne fait pas partie d'une commande shell mais plutôt d'un séparateur entre les commandes (comme ;c'est le cas). Bien que les deux soient des séparateurs de commandes, cela &a un effet supplémentaire sur la commande sur son côté gauche. Cela m'embrouille aussi parfois, et je fais souvent la même erreur. Une fois que vous le connaissez, il est cependant facile à corriger.

Le correctif consiste à ne pas écrire &;mais à écrire simplement l'un des deux séparateurs selon votre intention. (Et dans la plupart des cas où l'on a écrit, &;l'intention était d'écrire uniquement &).

Cela devrait fonctionner:

ssh server 'sudo shutdown -r +5 & disown'
kasperd
la source
7
Vous gagnez le prix d'aujourd'hui pour m'avoir appris quelque chose que je ne savais pas après 25 ans de dénigrement sous UNIX. Aussi +1!
MadHatter
Et s'il avait l'intention de fonctionner sudo shutdown -r +5 &en arrière-plan, puis de courir disown? Comment bash gérerait-il une telle situation? Je m'attendrais à ce que ce soit une syntaxe parfaite pour une commande, même en ayant &;. S'il ;s'agit d'un séparateur de commandes, vous disposez de 2 commandes. Droite?
Ismael Miguel
1
@IsmaelMiguel Je ne comprends pas votre question. L'utilisation &lancera la première commande en arrière-plan et une fois que la première commande aura été lancée, la deuxième sera exécutée au premier plan.
kasperd
Je voulais dire que sudo shutdown -r +5 &; disowncela ne semble pas être une mauvaise syntaxe. Je veux dire, mon intention pourrait être d'exécuter la première partie en arrière-plan, puis la 2e partie.
Ismael Miguel
@IsmaelMiguel L'analyseur de commandes pourrait probablement être étendu pour considérer la chaîne vide comme une commande valide qui réussit toujours. Dans ce cas, sudo shutdown -r +5 &; disownserait considéré comme trois commandes valides séparées par &et ;. Cela signifierait cependant qu'il faut faire attention à ne pas utiliser de séparateur supplémentaire si l'état existant de la commande précédente doit être utilisé. Cela signifie que l'on doit également faire attention à la tokenisation, car par exemple, &&et & &que la tokenisation est différente.
kasperd