290 votes

Faire en sorte que ssh exécute une commande en arrière-plan sur la machine cible

Il s'agit d'une question qui fait suite à la Comment utiliser ssh dans un shell script ? question. Si je veux exécuter une commande sur la machine distante qui s'exécute en arrière-plan sur cette machine, comment puis-je obtenir le retour de la commande ssh ? Lorsque j'essaie d'inclure l'esperluette (&) à la fin de la commande, celle-ci se bloque. La forme exacte de la commande ressemble à ceci :

ssh user@target "cd /some/directory; program-to-execute &"

Avez-vous des idées ? Il convient de noter que les connexions à l'ordinateur cible produisent toujours une bannière de texte et que j'ai obtenu des résultats positifs. SSH Les clés sont configurées de manière à ce qu'aucun mot de passe ne soit nécessaire.

303voto

Jax Points 1877

J'ai eu ce problème dans un programme que j'ai écrit il y a un an - il s'avère que la réponse est plutôt compliquée. Vous aurez besoin d'utiliser nohup ainsi que la redirection de sortie, comme expliqué dans l'article de wikipedia sur nohup copié ici pour votre commodité.

La suspension des travaux en arrière-plan est par utile par exemple lors d'une connexion via SSH, puisque les travaux en arrière-plan peuvent le shell se bloque lors de la déconnexion en raison d'une course [2]. Ce problème peut également également être résolu en redirigeant les trois flux d'E/S :

nohup myprogram > foo.out 2> foo.err < /dev/null &

246voto

Russ Points 669

C'est la façon la plus propre de le faire pour moi :-)

ssh -n -f user@host "sh -c 'cd /whereever; nohup ./whatever > /dev/null 2>&1 &'"

La seule chose qui s'exécute ensuite est la commande réelle sur la machine distante.

29voto

Rediriger les fd's

La sortie doit être redirigée avec &>/dev/null qui redirige à la fois stderr et stdout vers /dev/null et est un synonyme de >/dev/null 2>/dev/null o >/dev/null 2>&1 .

Paranthèses

Le meilleur moyen est d'utiliser sh -c '( ( command ) & )' où command est n'importe quoi.

ssh askapache 'sh -c "( ( nohup chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'

Coquille de Nohup

Vous pouvez également utiliser nohup directement pour lancer le shell :

ssh askapache 'nohup sh -c "( ( chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'

Beau lancement

Une autre astuce consiste à utiliser nice pour lancer la commande/le shell :

ssh askapache 'nice -n 19 sh -c "( ( nohup chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'

20voto

hometoast Points 6536

Si vous ne voulez/peux pas garder la connexion ouverte, vous pouvez utiliser écran si vous avez les droits pour l'installer.

18voto

Casey Points 19286

Je voulais juste montrer un exemple fonctionnel que vous pouvez couper et coller :

ssh REMOTE "sh -c \"(nohup sleep 30; touch nohup-exit) > /dev/null &\""

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X