Utilisez SSH pour lancer un processus de fond sur un serveur distant, et quitter la session

j'utilise SSH pour lancer un processus de background sur un serveur distant. C'est ce que j'ai pour le moment:

ssh remote_user@server.com " nohup process &"

Cela fonctionne, que le processus démarre. Mais la session SSH elle-même ne se termine pas avant que J'ai frappé Ctr-C.

quand j'appuie sur Ctr-c, le processus à distance continue de fonctionner en arrière-plan.

j'aimerais passer la commande ssh dans un script que je peux l'exécuter localement, donc je voudrait que la session ssh se termine automatiquement une fois que le processus à distance a commencé.

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

31
demandé sur futureshocked 2013-11-15 11:52:47

3 réponses

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

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

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

44
répondu Douglas 2014-03-12 21:33:28

en utilisant nohup, assurez-vous que vous redirigez aussi 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ée du processus distant. Soyez prudent avec l'utilisation de ssh -f user@host... car cela ne placera le processus ssh qu'en arrière-plan sur le appeler côté. Vous pouvez vérifier cela en lançant un ps -aux | grep ssh sur la machine d'appel et cela vous montrera que l'appel ssh est toujours actif, mais mettez juste en arrière-plan.

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

25
répondu Ronny Andersson 2014-03-25 12:26:15

Vous pouvez utiliser screen pour exécuter votre processus sur cet écran, détachez de l'écran Ctrl-a :detach et quittez votre session sans problème. Vous pouvez ensuite vous reconnecter à SSH et vous connecter à cet écran à nouveau 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'info voir ceci tutoriel

4
répondu Majlik 2016-11-22 23:01:53