249 votes

Prise en ssh pour exécuter une commande en arrière-plan sur l'ordinateur cible

C'est une question de la Façon dont vous utilisez ssh dans un script shell? 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 la commande ssh pour revenir? Lorsque j'essaie simplement d'inclure l'esperluette (&) à la fin de la commande se bloque. La forme exacte de la commande ressemble à ceci:

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

Des idées? Une chose à noter est que les connexions à l'ordinateur cible toujours produire un texte de la bannière et j'ai SSH clés mis en place donc pas de mot de passe est requis.

254voto

Jax Points 1877

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

Nohuping backgrounded emplois est pour exemple utile lorsque vous êtes connecté via SSH, depuis backgrounded des travaux peut provoquer la coque pour accrocher sur déconnexion pour une course état [2]. Ce problème peut également être surmontés en redirigeant tous les trois Flux e/S:

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

231voto

Russ Points 669

Cela a été 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 à courir après, c'est la commande sur la machine distante

23voto

Redirection de la fd

La sortie doit être réorientée en &>/dev/null qui redirige les deux stderr et stdout vers /dev/null et est un synonyme de >/dev/null 2>/dev/null ou >/dev/null 2>&1.

Parenthèse

La meilleure façon est d'utiliser des sh -c '( ( command ) & )' où la commande est rien.

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

Nohup Shell

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

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

Nice Lancement

Une autre astuce est d'utiliser de nice pour lancer la commande/shell:

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

16voto

hometoast Points 6536

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

16voto

Casey Points 19286

Je voulais juste montrer un exemple de travail 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: