web-dev-qa-db-fra.com

Maintenir les processus en cours d'exécution après la déconnexion de la session SSH

J'ai parfois des processus longs que je veux lancer avant de rentrer chez moi, donc je crée une session SSH sur le serveur pour démarrer le processus, mais ensuite je veux fermer mon ordinateur portable et rentrer chez moi et plus tard, après le dîner, je veux vérifier le processus que j'ai commencé avant de quitter le travail. Comment puis-je faire cela avec SSH? Ma compréhension est que si vous interrompez votre connexion SSH, vous interromprez également votre session de connexion sur le serveur, tuant ainsi le long processus.

216
λ Jonas Gorauskas

Utilisez Nohup pour que votre processus ignore le signal de raccrochage:

$ Nohup long-running-process &
$ exit
217
Warren Young

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

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

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

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

Lorsque vous revenez à votre ordinateur portable:

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

Découvrez ensuite la progression de votre long processus!

screen est un outil très complet et peut faire bien plus que ce que j'ai décrit. Pendant une session écran, essayez ctrl + a ,? pour apprendre quelques commandes courantes. Les plus courants sont probablement:

  • CTRL+a , c créer une nouvelle fenêtre
  • CTRL+a , n pour passer à la fenêtre suivante de votre session écran
  • CTRL+a , p pour passer à la fenêtre précédente de votre session écran
  • si vous vous connectez à partir de plusieurs systèmes différents, vous vous êtes peut-être accidentellement laissé connecté à une session d'écran active sur un autre ordinateur. pour cette raison, je reprends toujours avec screen -d -r pour m'assurer que si un autre Shell est attaché à ma session écran, il sera détaché avant de le reprendre sur mon système actuel.
143
Sandy

Si vous n'avez pas planifié à l'avance et configuré screen, etc., procédez comme suit:

  1. Si votre processus s'exécute en arrière-plan: passez à # 3, sinon: Ctrl-Z pour suspendre le processus de premier plan. Cela signalera le numéro de tâche du processus suspendu, par exemple:

    [1]+  Stopped                 processName
    
  2. Envoyez processName en arrière-plan avec bg %1 (en utilisant le numéro de travail suivant le %). Cela reprendra processName en arrière-plan.

  3. DisownprocessName avec disown %1 ou disown PID. Utilisez le -h flag si vous souhaitez conserver la propriété jusqu'à la fin de votre shell actuel.

42
Mike Covington

Ce que vous voulez utiliser, c'est un écran ou encore mieux un wrapper convivial autour de l'écran appelé byobu.

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

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

Une autre fonctionnalité intéressante est le fait que tout votre écran peut rester en place pendant que votre connexion ssh est déconnectée. Vous vous connectez à nouveau via ssh et appelez byobu et tout est comme avant.

Enfin quelques captures d'écran de byobu.

15
txwikinger

Il convient de noter que

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

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

et

ssh -t lala screen -S moo quux créera la session moo sur l'hôte lala et exécutera le programme quux, quittant la session à la fin.

9
cjac

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

Sudo apt-get install screen

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

Pour se déconnecter (mais laisser la session ouverte) Appuyez sur Ctrl + A et alors Ctrl + D en succession immédiate. 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 pas

screen -D -r

Pour créer une nouvelle fenêtre à l'intérieur d'une session d'écran en cours Appuyez sur Ctrl + A et alors C en succession immédiate. Vous verrez une nouvelle invite.

Pour passer d'une fenêtre d'écran à une autre Appuyez sur Ctrl + A et alors Ctrl + A en succession immédiate.

Pour répertorier les fenêtres d'écran ouvertes Appuyez sur Ctrl + A et alors W en succession immédiate

4

Vieille question, étrange encore, personne ne l'a conseillé tmux , qui agit comme un wrapper pour n consoles et les garde ouvertes jusqu'à ce qu'elles soient nécessaires. Cela permet plus de contrôle, à côté d'un certain nombre de fonctions que possède tmux. C'est facile à gérer, il vous suffit d'exécuter tmux, qui vous amène dans son shell, de démarrer votre travail looong, puis appuyez sur ctrl + b suivi de d (détacher) (ctrl+b est le "ok google" de tmux, et d est la commande pour fermer sans quitter le Shell). Cela fonctionne réellement si vous fermez, par exemple, PuTTY. Après le dîner, lorsque vous vous reconnectez, vous pouvez rouvrir tmux avec tmux attach pour voir votre écran exactement comme vous l'avez laissé. Quelque chose que j'aime est le fractionnement du volet: ctrl+b puis appuyez sur ". Pour passer d'un volet à un autre, ctrl+b puis appuyez sur la flèche haut/bas.

4
nnsense

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 auquel vous pouvez vous connecter et vous déconnecter encore et encore. La session X continue de fonctionner lorsque vous n'êtes pas connecté. Les connexions peuvent être établies de n'importe où. Vous pouvez choisir entre des fenêtres flottantes ou une seule fenêtre contenant un bureau entier (par exemple un bureau Gnome complet). 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 des fenêtres flottantes, elles apparaissent individuellement dans la barre des tâches de Windows.

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

2
Rob_before_edits

Tmux est une bonne option disponible pour exécuter vos processus de longue durée en arrière-plan.

Je dois continuer à exécuter les processus de longue durée sur une plate-forme Google Cloud VM instance/serveur (avec OS: Ubuntu 16.0). Où je dois démarrer le terminal SSH et à partir du terminal, j'ai pour garder le terminal connecté pour exécuter le processus. Maintenant, tout va bien. Mais attendez si la connexion avec mon terminal SSH est interrompue, les processus de longue durée s'arrêtent immédiatement et je dois donc les réexécuter une fois de plus le terminal ssh est redémarré ou à partir d'un nouveau terminal ssh.

Je trouve que tmux est la bonne solution pour éviter l'arrêt des processus que nous voulons exécuter même après la fermeture du terminal.

Multiplexeur de terminaux (tmux) pour démarrer la session tmux:

  1. Démarrez le terminal ssh
  2. Tapez tmux. Il ouvrira une fenêtre dans le même terminal.
  3. Exécutez la commande pour démarrer des processus de longue durée dans la session tmux.

Maintenant, même si le terminal SSH est fermé/arrêté soudainement, la session tmux continuera à exécuter les processus démarrés en cours sur l'instance/le serveur.

Si la connexion s'est terminée, comment la reconnecter pour voir les processus en cours d'exécution dans la session tmux en arrière-plan:

  1. reconnectez ou ouvrez un nouveau terminal ssh. Pour voir ce processus (qui s'exécute en arrière-plan), tapez: tmux attach commande.

Vous souhaitez mettre fin à la session tmux:

  1. Arrêtez le processus. Tapez ensuite exit dans tmux-terminal-window.

(Notez que: si nous utilisons tmux detach commande: elle quittera la fenêtre/le terminal de session tmux sans terminer/arrêter les sessions tmux)

Pour plus de détails, veuillez consulter l'article suivant:

  1. https://www.tecmint.com/keep-remote-ssh-sessions-running-after-disconnection/
  2. https://limitlessdatascience.wordpress.com/2019/08/22/tmux-to-keep-jupyter-notebook-running-in-the-background/
1
Yogesh