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?
&
personnage envoie la commande sur le côté gauche en arrière-plan. C'est en quoi cela diffère;
.Réponses:
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:
la source
sudo shutdown -r +5 &
en arrière-plan, puis de courirdisown
? 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?&
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.sudo shutdown -r +5 &; disown
cela 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.sudo shutdown -r +5 &; disown
serait 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.