886 votes

Comment maintenir les processus en cours après la fin de la session ssh ?

Disons que je lance un ensemble de processus à partir d'une session ssh. Est-il possible de mettre fin à la session ssh tout en maintenant ces processus en cours d'exécution sur la machine distante ?

3 votes

1004voto

tongpu Points 10689

Vous devriez rechercher des alternatives modernes comme tmux .

tmux est supérieure à screen pour de nombreuses raisons, dont voici quelques exemples :

  • Les fenêtres peuvent être déplacées d'une session à l'autre et même liées à plusieurs sessions.
  • Les fenêtres peuvent être divisées en volets horizontaux et verticaux.
  • Prise en charge des terminaux UTF-8 et 256 couleurs
  • Les sessions peuvent être contrôlées à partir du Shell sans avoir besoin d'entrer dans une session.

Fonctionnalité de base

Pour obtenir la même fonctionnalité que celle expliquée dans le réponse recommander screen vous devrez effectuer les tâches suivantes :

  • ssh dans la machine distante
  • commencer tmux en tapant tmux dans le Shell.
  • lancez le processus que vous voulez à l'intérieur du processus lancé tmux session
  • quitter/détacher le tmux en tapant Ctrl + b et ensuite d

Vous pouvez maintenant vous déconnecter de la machine distante en toute sécurité, votre processus continuera à fonctionner à l'intérieur de la machine. tmux . Lorsque vous revenez et que vous souhaitez vérifier l'état de votre processus, vous pouvez utiliser la fonction tmux attach à joindre à votre tmux session.

Si vous souhaitez faire fonctionner plusieurs sessions côte à côte, vous devez nommer chaque session en utilisant Ctrl + b y $ . Vous pouvez obtenir une liste des sessions en cours d'exécution en utilisant tmux list-sessions ou simplement tmux ls Maintenant, attachez-vous à une session en cours avec la commande tmux attach-session -t <session-name> .

tmux peut faire des choses beaucoup plus avancées que de gérer une seule fenêtre dans une seule session. Pour plus d'informations, consultez le site man tmux o la page GitHub de tmux . En particulier, Voici une FAQ sur les principales différences entre screen y tmux .

1 votes

Tmux est vraiment la voie à suivre de nos jours. GNU Screen est bien, mais Tmux vous donne beaucoup plus de fonctionnalités, comme l'attachement à partir de plusieurs endroits sans avoir à se détacher. C'est génial.

4 votes

@CraigM Utiliser screen -x -r [screenname] o screen -rx pour faire court si vous n'avez qu'une seule session d'écran active. Cela vous permet d'attacher une instance d'écran existante.

8 votes

Ce conseil m'a aidé à résoudre le même problème, mais je pense qu'il comporte une faute de frappe. Je suis presque sûr que vous devez taper Ctrl-b et ensuite d afin de quitter/détacher le tmux session. C'est en tout cas le cas pour la version de tmux sur mon Ubuntu 12.04.

488voto

coteyr Points 16560

Option 1 : nohup

Le meilleur moyen est souvent le plus simple.

nohup long-running-command &

Il a été conçu spécifiquement pour cela, il enregistre même la sortie stdout vers nohup.log .

man nohup

Option 2 : bg + disown

ctrl+z
bg
disown -h

Si vous voulez "mettre en arrière-plan" les tâches déjà en cours, alors Ctrl + Z puis exécutez bg pour mettre votre dernière tâche suspendue en arrière-plan, lui permettant de continuer à s'exécuter. disown maintiendra le processus en cours après votre déconnexion. Le site -h empêche le raccrochage.


screen et d'autres peuvent le faire, mais ils ne sont pas là pour ça. Je recommande nohup pour les tâches que vous savez que vous allez laisser derrière vous et bg pour les tâches que vous exécutez déjà et que vous ne voulez pas relancer.

Gardez à l'esprit que les deux sont spécifiques à Bash. Si vous n'utilisez pas bash, les commandes peuvent être différentes.

9 votes

Je recommande de faire disown -h

0 votes

Il est intéressant de noter que screen et tmux ne fonctionnent pas pour miner, bur nohup fonctionne

4 votes

bg + disown n'a pas fonctionné pour moi. J'avais un déploiement script en cours d'exécution que j'ai oublié de lancer à l'intérieur de tmux, et j'ai dû partir tôt pour une réunion. Le script sort continuellement la progression vers le script. ctrl+z a arrêté le processus, me ramenant à bash. bg a repris le processus, mais il a également repris l'envoi de l'état à bash, rendant impossible de voir ce que je tapais. Cependant, un disown La commande a produit "disown : current : no such job".

256voto

Ciaran Points 4325

Vous pouvez le faire en utilisant screen .

Type man screen pour en savoir plus ou lire ceci page de manuel de l'écran .

Un scénario simple :

  • ssh dans votre boîte distante. Tapez screen Ensuite, lancez le processus que vous souhaitez.

  • Appuyez sur Ctrl - A entonces Ctrl - D . Cela va "détacher" votre session d'écran mais laisser vos processus en cours. Vous pouvez maintenant vous déconnecter du boîtier distant.

  • Si vous voulez revenir plus tard, connectez-vous à nouveau et tapez screen -r Cela va "reprendre" votre session d'écran, et vous pouvez voir la sortie de votre processus.

41 votes

Je nomme généralement mes sessions d'écran en utilisant screen -S name pour faciliter la connexion à la bonne par la suite.

0 votes

La liaison est interrompue

2 votes

Personnellement, je travaille sur une boîte sans aucun logiciel de contrôle des paquets. Après avoir passé environ une demi-heure à construire des dépendances pour TMUX (avec lequel j'ai personnellement de l'expérience et que j'aime) à partir des sources, il est devenu clair que screen était la meilleure et plus simple solution pour moi. TL;DR : la solution optimale à ce problème dépend du cas d'utilisation, de la machine et du temps dont vous disposez pour la mise en place. Merci pour cette réponse :)

96voto

doekman Points 291

Screen et nohup est la meilleure méthode, mais si vous devez détacher un processus déjà en cours d'exécution sans screen ou nohup, vous pouvez exécuter la commande disown.

disown [-ar] [-h] [jobspec… |pid… ]

Sans options, supprimez chaque fiche de poste du tableau des travaux actifs. Si le -h est donnée, le travail n'est pas supprimé de la table, mais est marqué de sorte que SIGHUP n'est pas envoyé au travail si le Shell reçoit un SIGHUP. Si fiche de poste n'est pas présent, et ni le -a ni le -r est fournie, le travail en cours est utilisé. Si aucune fiche de poste est fourni, le -a permet de supprimer ou de marquer tous les travaux ; l'option -r sans l'option fiche de poste restreint l'opération aux travaux en cours.

Avec disown, vous pouvez fermer le terminal et faire tourner le processus sur la machine.

13 votes

C'est aussi ma façon préférée de procéder. J'utilise fréquemment disown -a && exit

1 votes

Parfait. C'est une belle commande et elle mérite tous les votes positifs !

8 votes

Un mot d'avertissement, j'ai arrêté un processus en cours avec Ctrl-Z et ne l'ai pas démarré en arrière-plan avant d'appeler disown et ça l'a tué.

81voto

Adam Albrecht Points 2525

J'étais coincé dans un gros mv et je n'étais donc pas en mesure d'arrêter le processus, de configurer l'écran puis de le relancer. J'ai réussi à quitter la session SSH avec le processus en cours d'exécution en effectuant essentiellement les étapes suivantes :

  1. Établir une connexion SSH : ssh user@host
  2. Exécutez la commande souhaitée pour lancer le processus
  3. Appuyez sur Ctrl + Z pour mettre en pause le processus
  4. Exécuter bg pour mettre le processus en pause en arrière-plan et le reprendre.
  5. Exécuter disown [pid] (l'ID du processus est facultatif, par défaut le dernier processus) pour désavouer le processus. Pour obtenir une liste des travaux, tapez simplement jobs avant.
  6. Quittez la session SSH en exécutant logout .

Utilisation de la disown commandement :

disown [-ar] [-h] [jobspec ... | pid ... ]
              Without  options,  remove  each jobspec from the table of active
              jobs.  If jobspec is not present, and neither the -a nor the  -r
              option  is  supplied, the current job is used.  If the -h option
              is given, each jobspec is not removed from  the  table,  but  is
              marked  so  that  SIGHUP  is  not  sent  to the job if the shell
              receives a SIGHUP.  If no jobspec is  supplied,  the  -a  option
              means  to  remove or mark all jobs; the -r option without a job
              spec argument restricts operation to running jobs.   The  return
              value is 0 unless a jobspec does not specify a valid job.

4 votes

Les encastrés sont toujours mon premier choix :) THX

0 votes

Cette réponse doit être marquée comme correcte. Installer et s'habituer à l'écran pour résoudre ce problème est exagéré.

0 votes

Ceci est très utile lorsque vous avez déjà lancé une commande et qu'elle est en cours d'exécution depuis longtemps. La terminer et la lancer dans une session TMUX prendra du temps.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X