web-dev-qa-db-fra.com

Utilisez SSH pour démarrer un processus d'arrière-plan sur un serveur distant et quitter la session

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

ssh [email protected] "Processus Nohup &"

Cela fonctionne, dans la mesure où le processus démarre. Mais la session SSH elle-même ne se termine que lorsque je frappe Ctr-C.

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

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

Y a-t-il un moyen d'y arriver?

34
futureshocked

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 Shell, vous verrez alors la sortie "foo". Cinq secondes plus tard, vous verrez alors la sortie "bar". En attendant, vous auriez pu utiliser le Shell.

48
Douglas

Lorsque vous utilisez Nohup, assurez-vous de rediriger également 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... puisque cela ne mettra que le processus ssh en arrière-plan du côté appelant. Vous pouvez le vérifier 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 mis en arrière-plan.

Dans mon exemple ci-dessus, j'utilise DISPLAY=:0 puisque xeyes est un programme X11 et je veux qu'il démarre sur la machine remote.

26
Ronny Andersson

Vous pouvez 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 vous attacher à nouveau à cet écran pour continuer votre tâche ou vérifier si c'est terminé.

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

ssh [email protected]
screen -dmS new_screen sh
screen -S new_screen -p 0 -X stuff $'Nohup process \n'
exit    

Pour plus d'informations, consultez ce tutoriel

4
Majlik