Question Utiliser SSH pour démarrer un processus en arrière-plan sur un serveur distant et quitter la session


J'utilise SSH pour démarrer un processus en arrière-plan sur un serveur distant. C'est ce que j'ai en ce moment:

ssh remote_user@server.com "nohup process &"

Cela fonctionne, en ce sens que le processus commence. Mais la session SSH elle-même ne se termine pas avant que je n'atteigne Ctr-C.

Lorsque j'appuie sur Ctr-C, le processus distant continue à s'exécuter en arrière-plan.

Je voudrais placer la commande ssh dans un script que je peux exécuter localement. Je voudrais donc que la session ssh se ferme automatiquement une fois le processus distant démarré.

Y a-t-il un moyen de rendre cela possible?


30
2017-11-15 07:52


origine


Réponses:


L'option "-f" de ssh indique à ssh d'exécuter la commande à distance en arrière-plan et de revenir immédiatement. Par exemple.,

ssh -f user@host "echo foo; sleep 5; echo bar"

Si vous tapez ce qui précède, vous obtiendrez immédiatement votre invite de commandes, vous verrez alors la sortie "foo". Cinq secondes plus tard, vous verrez alors la sortie "bar". En attendant, vous auriez pu utiliser le shell.


43
2018-03-12 21:33



En utilisant nohup, assurez-vous également de rediriger stdin, stdout et stderr:

ssh user@server 'DISPLAY=:0 nohup xeyes < /dev/null > std.out 2> std.err &'

De cette façon, vous serez complètement détaché du processus distant. Attention à utiliser ssh -f user@host... car cela ne mettra que le processus ssh en arrière-plan sur le appel côté. Vous pouvez vérifier cela en exécutant un ps -aux | grep ssh sur la machine appelante et cela vous montrera que l'appel ssh est toujours actif, mais juste mettre en arrière-plan.

Dans mon exemple ci-dessus, j'utilise DISPLAY=:0 depuis xeyes est un programme X11 et je veux qu'il a commencé sur le éloigné machine.


25
2018-03-25 12:26



Vous pourriez utiliser screen pour exécuter votre processus sur cet écran, détachez-vous de l'écran Ctrl-a :detach et quittez votre session en cours sans problème. Ensuite, vous pouvez vous reconnecter à SSH et joindre à nouveau cet écran pour continuer votre tâche ou vérifier si elle est terminée.

Ou vous pouvez envoyer la commande à un écran déjà en cours d'exécution. Votre script local devrait ressembler à ceci:

ssh remote_user@server.com
screen -dmS new_screen sh
screen -S new_screen -p 0 -X stuff $'nohup process \n'
exit    

Pour plus d'infos voir ceci Didacticiel


4
2017-11-15 08:19