Maintenir les sessions SSH en cours après la déconnexion

208

J'ai parfois des processus longs à lancer avant de rentrer à la maison. Je crée donc une session SSH sur le serveur pour démarrer le processus, mais je souhaite ensuite fermer mon ordinateur portable et rentrer à la maison. Plus tard, après le dîner, je souhaite vérifier le processus que j'ai commencé avant de quitter le travail. Comment puis-je faire cela avec SSH? Je crois comprendre que si vous cassez votre connexion SSH, votre session de connexion sur le serveur sera également interrompue, ce qui mettra fin au processus de longue durée.

λ Jonas Gorauskas
la source

Réponses:

205

Utilisez nohuppour que votre processus ignore le signal de blocage:

$ nohup long-running-process &
$ exit
Warren Young
la source
20
Ça y est. Pas besoin d'installer screen ou tmux. C'est en fait la bonne vieille façon de le faire. Bien sûr, 'écran' ou 'tmux' sont des applications merveilleuses qui doivent être utilisées en cas de besoin, mais aussi simples que d'exécuter un processus en arrière-plan à partir duquel vous pouvez vous déconnecter, optez pour ce qui précède.
reiche
2
Nohup est-il comme désavoué?
Cjac
28
Ils ont des buts similaires, mais ils diffèrent de nombreuses manières. nohupintercepte SIGHUP afin que le shell qui l'exécutait se ferme et envoie SIGHUP à tous ses enfants toujours en cours d'exécution long-running-processne meurt pas. disownsupprime simplement le travail spécifié de la liste des enfants de Bash afin qu'il ne tente pas d'envoyer du tout SIGHUP. nohupest un programme distinct du shell, donc il fonctionne avec tous les shell, alors qu’il disownest un Bash builtin. nohupaccepte la commande à exécuter, alors disownque fonctionne uniquement après que le travail a été démarré et que vous l'avez mis en arrière-plan afin que vous puissiez revenir au shell.
Warren Young
3
Examen rapide génial pour ceux qui ne sont pas familiers avec nohup et désavouer - ainsi que des moyens faciles à traiter avec des sessions de terminal serverwatch.com/tutorials/article.php/3935306/...
Dan
7
tail -f nohup.outpour vérifier ce qui se passe à votre retour.
Ricardo Stuven
141

Vous voulez utiliser GNU Screen. C'est super génial!

ssh [email protected]
screen               #start a screen session
run-a-long-process

CTRL+ a, dpour détacher de votre session écran

exit                 #disconnect from the server, while run-a-long-process continues

Lorsque vous revenez sur votre ordinateur portable:

ssh [email protected]
screen -r            #resume the screen session

Ensuite, vérifiez la progression de votre processus de longue durée!

screenest un outil très complet, et peut faire beaucoup plus que ce que j'ai décrit. Pendant une session d’écran, essayez les touches ctrl + a ,? apprendre quelques commandes communes. Les plus communs sont probablement:

  • CTRL+ a, cpour créer une nouvelle fenêtre
  • CTRL+ a, npour passer à la fenêtre suivante de votre session d'écran
  • CTRL+ a, ppour passer à la fenêtre précédente de votre session d'écran
  • Si vous vous connectez à partir de plusieurs systèmes, vous vous êtes peut-être laissé accidentellement attaché à une session d'écran active sur un autre ordinateur. pour cette raison, je reprends toujours avec screen -d -rpour m'assurer que si un autre shell est attaché à ma session écran, il sera détaché avant que je ne le reprenne sur mon système actuel.
Sablonneux
la source
8
tmux est un analogue moderne d’écran.
Zvolkov
Je ne sais pas pour moderne, mais le préfixe de clé par défaut de tmux (Ctrl + b) aide si vous êtes habitué à bash / emacs.
sajith
2
l'écran est assez cool si vous voulez un terminal partagé pour une raison quelconque. Créez un écran screen -S nameet laissez votre autre ami s'y connecter avec screen -x name.
Patrick
1
tmuxwith tmuxinatorest une excellente combinaison pour les configurations sophistiquées, alors que je préfère screencomme solution simple et rapide.
earthmeLon
Cette réponse est la meilleure. J'aime ça. Excellente recherche
Jaffer Wilson
42

Si vous n'avez pas planifié, paramétré screen, etc., procédez comme suit:

  1. Si votre processus s'exécute en arrière-plan: passez Ctrl-Zà l'étape 3, sinon: pour suspendre le processus de premier plan. Ceci indiquera le numéro de travail du processus suspendu, par exemple:

    [1]+  Stopped                 processName
    
  2. Envoyez processNameà l'arrière-plan avec bg %1(en utilisant le type de travail qui suit le %). Cela va reprendre processNameen arrière-plan.

  3. Disown processName avec disown %1ou disown PID. Utilisez l' -hindicateur si vous souhaitez conserver la propriété jusqu'à ce que vous terminiez votre shell actuel.

Mike Covington
la source
5
Merci pour cela! J'avais un travail en cours et je pensais que je ne pourrais pas le garder parce que je ne l'avais pas utilisé &au début. Cela semble bien fonctionner!
Matt
4
Ceci est incroyable! Je n'ai jamais su que Linux pourrait vous laisser transférer le contrôle de processus actifs comme celui-ci. J'avais peur que ma batterie meure lors de la connexion de SSH à mon serveur au milieu d'un processus long, et c'était la solution pour moi!
Pluton
14

Ce que vous voulez utiliser est un écran ou mieux encore un wrapper convivial appelé byobu.

Screen vous permet d'exécuter plusieurs sessions de terminal virtuel dans la même session ssh. Un tutoriel et des pages d'aide sont disponibles.

Byobu est un wrapper qui permet d’ouvrir facilement de nouveaux écrans avec une simple touche de fonction au lieu d’une combinaison de touches ctrl-a. Il affiche également une ligne d'état avec tous les terminaux virtuels ouverts pouvant être nommés.

Une autre fonctionnalité intéressante est le fait que tout votre écran peut rester en place tant que votre connexion SSH est déconnectée. Vous venez juste de vous connecter à nouveau via ssh et d’appeler byobu et tout est comme avant.

Enfin quelques captures d' écran de Byobu.

txwikinger
la source
J'ai lancé un processus sur mon serveur dans Byobu Terminal sans vraiment savoir ce que c'était (j'ai juste cherché Terminal et cliqué sur Byobu car je ne l'avais jamais vu auparavant). J'ai continué à utiliser Byobu car il y avait une barre d'état colorée en bas et je pensais que c'était cool. Aujourd'hui, je me suis retrouvé à vouloir accéder à cette session de terminal à distance via SSH. Tout ce que je devais faire était de taper "byobu" et cela montrait immédiatement cette session de terminal. Vraiment heureux je suis tombé sur byobu!
Nick
8

Il pourrait être intéressant de noter que

ssh -t lala screen -rxU moose joindra à la session moo sur l'hôte lala

ssh -t lala screen -S moocréera la session moo sur l'hôte lala

et

ssh -t lala screen -S moo quuxcréera la session moo sur l'hôte lala et exécutera le programme quux , en quittant la session une fois terminée.

cjac
la source
3

Vieille question, étrange toujours, personne n’avait conseillé tmux , qui agit comme une enveloppe pour n consoles et les garde ouvertes jusqu’au besoin. Cela permet plus de contrôle, à côté d’un certain nombre de fonctions de tmux. C'est facile à gérer, il suffit d'exécuter tmux, ce qui vous amène dans son shell, lancez votre travail looong, puis appuyez sur ctrl + b suivi de d (detach) ( ctrl+best le "ok google" de tmux et dla commande de fermeture sans sortie de la coque). Cela fonctionne réellement si vous fermez, par exemple, le mastic. Après le dîner, lorsque vous vous reconnectez, vous pouvez rouvrir tmux tmux attachpour voir votre écran exactement comme vous êtes parti. Quelque chose que j'aime divise le volet: ctrl+bpuis appuyez sur ". Pour passer d’un volet à un autre, ctrl+bpuis appuyez sur la flèche haut / bas.

insensé
la source
3

Vous pouvez trouver un bon guide ici: Gardez votre session SSH en marche lorsque vous vous déconnectez.

sudo apt-get install screen

Vous pouvez maintenant démarrer une nouvelle session d’écran en tapant simplement écran sur la ligne de commande. Vous verrez des informations sur l'écran. Appuyez sur Entrée et vous serez à une invite normale.

Pour vous déconnecter (tout en laissant la session en cours) Appuyez sur Ctrl+ A, puis sur Ctrl+ Dimmédiatement. Vous verrez le message [détaché]

Pour vous reconnecter à une session déjà en cours

screen -r

Pour vous reconnecter à une session existante ou en créer une nouvelle s'il n'en existe aucune

screen -D -r

Pour créer une nouvelle fenêtre dans une session d’écran en cours d’exécution, appuyez sur Ctrl+ A, puis Cimmédiatement après. Vous verrez une nouvelle invite.

Pour passer d’une fenêtre d’écran à une autre Hit Ctrl+ Apuis Ctrl+ Aimmédiatement.

Pour lister les fenêtres ouvertes, appuyez sur Ctrl+ Apuis Wimmédiatement

Victor Hugo Arango A.
la source
Vous pouvez utiliser <kbd>Ctrl</kbd>pour afficher les noms sous forme de touches du clavier.
Tomasz
1

J'utilise NX NoMachine, qui est gratuit pour moi car ce n'est que moi. Essentiellement, il exécute une session X sur le serveur, à laquelle vous pouvez vous connecter et vous déconnecter à plusieurs reprises. La session X continue de fonctionner lorsque vous n'êtes pas connecté. Les connexions peuvent être faites de n'importe où. Vous pouvez choisir entre des fenêtres flottantes ou une seule fenêtre contenant un bureau complet (par exemple, un bureau complet de Gnome). Le client (que vous exécuteriez sur votre ordinateur portable) peut être exécuté sur Linux, MacOS, Solaris ou Microsoft Windows. Dans ce dernier cas, si vous choisissez les fenêtres flottantes, elles apparaissent individuellement dans la barre des tâches Windows.

J'utilise mon ordinateur portable Windows XP (dont j'ai besoin pour certains matériels spécifiques à Windows que je possède) comme interface frontale pour mes deux serveurs Linux utilisant NX Nomachine. Je peux même imprimer sur l'imprimante connectée à mon ordinateur portable Windows sous Linux.

Rob_before_edits
la source