J'ai écrit un script que j'utilise pour pousser et déployer un nouveau service sur plusieurs machines sous mon contrôle, et afin d'exécuter le processus, j'utilise ssh pour démarrer le processus à distance. Malheureusement, chaque fois que j'utilise SSH pour démarrer le processus, la commande SSH ne semble jamais revenir, provoquant le blocage du script.
La commande est spécifiée comme: ssh $ user @ $ host "/ root / command &". Chaque fois que j'exécute des commandes simples, telles que ps ou who, la commande SSH revient immédiatement, mais lorsque j'essaie de démarrer mon processus, elle ne revient pas. J'ai essayé des astuces comme envelopper mon processus dans un simple script bash qui démarre le processus puis se termine, mais cela bloque également la commande SSH (même si le script bash fait écho à un message de réussite et se termine normalement).
Quelqu'un a-t-il une idée de la cause de ce comportement et de la façon de récupérer la commande SSH dès que le processus a été démarré?
Merci pour vos idées!
Réponses:
SSH connecte stdin, stdout et stderr du shell distant à votre terminal local, afin que vous puissiez interagir avec la commande qui s'exécute sur le côté distant.
En tant qu'effet secondaire, il continuera à fonctionner jusqu'à ce que ces connexions soient fermées, ce qui ne se produit que lorsque la commande à distance et tous ses enfants (!) Sont terminés (car les enfants, qui sont ce que "&" démarre, héritent std * de leur processus parent et laissez-le ouvert).
Vous devez donc utiliser quelque chose comme
Les <,> et 2> & 1 redirigent stdin / stdout / stderr loin de votre terminal. Le "&" fait ensuite passer votre script en arrière-plan. En production, vous devez bien sûr rediriger stdin / err vers un fichier journal approprié.
Voir
http://osdir.com/ml/network.openssh.general/2006-05/msg00017.html
Éditer:
Je viens de découvrir que ce qui
< /dev/null
précède n'est pas nécessaire (mais la redirection stdout / err l' est ). Je ne sais pas pourquoi ...la source
+1
! Travaille pour moi. Et vous pouvez également imprimer la sortie en faisant écho au fichier journal:ssh user@host "/script/to/run > /tmp/ssh.stdout 2>&1 && cat /tmp/ssh.stdout && rm -f /tmp/ssh.stdout"
Vous pourriez essayer nohup . Man nohup pour plus de détails.
Si vous souhaitez conserver la sortie sur la machine distante, voici une variante .
la source
Une autre alternative serait de tirer un détaché
screen(1)
, quelque chose comme:Cela démarrera un écran détaché (qui capture toutes les interactions à l'intérieur de celui-ci), puis reviendra immédiatement, mettant fin à la session ssh.
Avec un peu plus d'ingéniosité, vous pouvez résoudre des appels de commande à distance assez complexes de cette façon.
la source
la source
Je pense que la bonne façon serait
la source