Question Comment garder les processus en cours d'exécution après la fin de la session ssh?


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


506
2017-10-21 12:09


origine


En relation: unix.stackexchange.com/questions/4004/… - Anton Tarasenko


Réponses:


Vous devriez chercher des alternatives modernes comme tmux.

tmux est supérieur à screen pour plusieurs raisons, voici quelques exemples:

  • Windows peut être déplacé entre les sessions et même lié à plusieurs sessions
  • Windows peut être divisé horizontalement et verticalement en volets
  • Prise en charge des terminaux UTF-8 et 256 couleurs
  • Les sessions peuvent être contrôlées depuis le shell sans avoir à entrer dans une session

Fonctionnalité de base

Pour obtenir les mêmes fonctionnalités que celles expliquées dans le répondre recommander screen, vous devez faire ce qui suit:

  • ssh dans la machine distante
  • début tmux en tappant tmux dans la coquille
  • commencer le processus que vous voulez dans le début tmux session
  • laisser / détacher le tmux session en tapant Ctrl+b et alors  

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

Si vous voulez avoir plusieurs sessions côte à côte, vous devez nommer chaque session en utilisant Ctrl+b et $. Vous pouvez obtenir une liste des sessions en cours en utilisant tmux list-sessions, maintenant attacher à une session en cours d'exécution avec la commande tmux attach-session -t 0.

tmux peut faire des choses beaucoup plus avancées que gérer une seule fenêtre en une seule session. Pour plus d'informations, jetez un coup d'oeil dans man tmux ou la page tmux GitHub. En particulier, voici une FAQ sur les principales différences entre screen et tmux.


594
2017-11-23 09:26



Utilisation @CraigM screen -x -r [screenname] ou screen -rx en bref si vous n'avez qu'une seule session d'écran active. Cela vous permet de joindre une instance d'écran existante. - Lekensteyn
Ce conseil m'a aidé avec le même problème mais je pense qu'il inclut une faute de frappe. Je suis sûr que vous devez taper Ctrl-b et alors d pour quitter / détacher le tmux session. C'est certainement le cas pour la version de tmux sur mon Ubuntu 12.04. - cxrodgers
J'ai fait une erreur en suivant les instructions ci-dessus. Je le partagerai si quelqu'un tombe dans la même erreur: j'ai démarré tmux dans le shell de mon propre ordinateur au lieu du shell de l'ordinateur distant. Il faut démarrer tmux dans le shell de l'ordinateur distant. - Mert Nuhoglu
L'écran est en cours de développement: lists.gnu.org/archive/html/screen-devel/2014-04/msg00024.html Pourriez-vous mettre à jour votre réponse? - muru
Alternativement, courir tmux detach au lieu de taper ctrl-b d - Andrew MacFie


Le meilleur moyen est souvent le plus simple.

nohup long-running-command &

Il a été spécialement conçu pour cela, il enregistre même stdout dans nohup.log

man nohup

Si vous voulez "fond" certaines tâches déjà en cours, alors votre meilleur pari est de ctrl + z puis de courir

bg (cela mettra en arrière votre dernière tâche suspendue, lui permettant de continuer à fonctionner)

puis un rapide disown devrait garder le processus en cours d'exécution après vous déconnecter.

screen et d'autres peuvent le faire, mais ce n'est pas ce qu'ils recherchent. je recommande nohup pour les tâches que vous connaissez vous allez partir et bg pour les tâches que vous exécutez déjà et que vous ne souhaitez pas redémarrer.

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


217
2017-11-28 02:58



Je recommanderais de faire disown -h - Michele
intéressant écran et tmux ne fonctionne pas pour mineur, bur nohup fonctionne - Yasin Okumuş
bg + disown n'a pas fonctionné pour moi. J'avais un script de déploiement en cours d'exécution J'ai oublié de démarrer à l'intérieur de tmux et je devais partir tôt pour une réunion. Le script génère en permanence des progrès vers le shell. ctrl+z arrêté le processus, me ramenant à bash. bg a repris le processus, mais il a également repris la sortie du statut à bash, rendant impossible de voir ce que je tapais. Cependant, un disown commande produite "désavoué: actuel: pas un tel travail" - BrianHVB


Vous pouvez le faire en utilisant screen.

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

Scénario simple:

  • ssh dans votre boîte à distance. Type screen Puis commencez le processus que vous souhaitez.

  • presse Ctrl-UNE puis Ctrl-. Cela détachera votre session d’écran mais laissera vos processus en marche. Vous pouvez maintenant vous déconnecter de la boîte distante.

  • Si vous voulez revenir plus tard, reconnectez-vous et tapez screen -r Cela va "reprendre" votre session d'écran et vous pouvez voir le résultat de votre processus.


179
2017-10-21 12:20



Je vais généralement nommer mes sessions écran en utilisant screen -S name pour faciliter la connexion ultérieure au correct. - David Oneill
Le lien est en panne - Gab是好人
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 (que j'ai personnellement expérimentées et appréciées) à partir des sources, il est devenu évident que l'écran était la solution la plus simple et la meilleure pour moi. TL; DR: la solution optimale à ce problème dépend du cas d'utilisation, de la machine et du temps nécessaire pour la configuration. Merci pour cette réponse :) - Max von Hippel
Combinaison avec screen -S avant de partir et screen -r en revenant c'est incroyable! - Meloman
Merci pour cela. Cette solution a fonctionné pour moi alors que tmux ne l’a pas fait (j’utilise une version de bash pour windows en ssh'ing dans une machine Linux) - Michael Sorensen


Screen and nohup est la meilleure solution, mais si vous devez détacher un processus déjà exécuté sans écran ou nohup, vous pouvez exécuter la commande de désinscription.

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

Sans options, retirez chaque jobspec de la table des emplois actifs. Si la -h L'option est donnée, le travail n'est pas supprimé de la table, mais est marqué pour que SIGHUP ne soit pas envoyé au travail si le shell reçoit un SIGHUP. Si jobspec n'est pas présent, et ni le -a ni le -r l'option est fournie, le travail en cours est utilisé. Sinon jobspec est fourni, le -a option signifie supprimer ou marquer tous les travaux; la -r option sans jobspec L'argument limite le fonctionnement à l'exécution des travaux.

Avec la suppression, vous pouvez fermer le terminal et lancer le processus sur la machine.


72
2017-10-21 13:19



C'est aussi ma façon préférée de le faire. J'utilise fréquemment disown -a && exit - Stefano Palazzo♦
Parfait. C'est une commande adorable et mérite toutes les citations! - Greg
Un mot de prudence, 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é. - HDave
Peut tomber en panne s'il veut écrire sur le terminal. La redirection de la sortie d'un processus en cours d'exécution n'est pas aussi simple. Mieux vaut le démarrer correctement avec nohup. - jiggunjer
C'est une bonne réponse car elle répond directement à la question. L'auteur de la question a demandé quoi faire après ayant déjà exécuté un tas de longues commandes en cours d'exécution. La plupart de ces réponses vous permettent de savoir quoi faire avant vous exécutez les commandes. - q0rban


Je me suis retrouvé coincé dans un grand véhicule virtuel, donc je n'étais pas en mesure d'arrêter le processus, de configurer l'écran et de le redémarrer. J'ai réussi à quitter la session ssh avec le processus en cours en procédant essentiellement comme suit:

  1. ssh [serveur]
  2. commander
  3. CTRL + Z
  4. bg
  5. renier
  6. Sortie

L'étape 3 interrompt le processus en cours (par exemple, ma commande «mv»). L'étape 4 place le processus en pause en arrière-plan et le reprend. L'étape 5 vous permet de rejeter le processus.


37
2017-11-25 03:30



Les encastrés sont toujours mon premier choix :) THX - ken_oy
Cette réponse devrait être marquée comme étant correcte. Pour installer et se familiariser avec la résolution de ce problème, il est exagéré. - Ulrich-Lorenz Schlüter
Ceci est très utile lorsque vous avez déjà lancé une commande et que celle-ci est en cours d'exécution depuis longtemps. Terminer et démarrer dans une session TMUX prendra du temps - Deepali Mittal


Il existe deux principaux programmes que vous pouvez utiliser pour maintenir les programmes et l'état du terminal sur plusieurs connexions ssh. Ils sont écran (le titulaire, mais malheureusement pas maintenu. Apparemment être activement développé maintenant) et tmux (plus récent, activement maintenu). Byobu est une interface qui peut fonctionner sur ces systèmes et offre des informations supplémentaires sur l'état d'ubuntu. Sur les nouvelles installations, il utilisera tmux en tant que backend, si vous avez une ancienne installation de byobu et une configuration existante, il conservera le backend précédent, que ce soit à l'écran ou en tmux.

Byobu

Byobu peut être installé sur l'ordinateur en le faisant sur une machine basée sur Debian:

sudo aptitude install byobu

En utilisant miam, tu fais

su -c 'yum install byobu'

Il est également possible d'installer byobu sur d'autres distributions.

Utiliser byobu

Vous pouvez démarrer byobu en courant byobu sur la machine hôte après la connexion à l'aide de ssh. Cela vous donnera un shell qui ressemble à ceci:

image-byobu

Vous pouvez également utiliser Byobu Terminal sur une machine Ubuntu avec l'option -X et avoir facilement un byobu parfaitement fonctionnel.

Usage:

Commencez byobu en tapant byobu.

Vous pouvez appuyer sur F2 pour créer une nouvelle fenêtre dans la session en cours, F3-F4 pour basculer entre les différentes fenêtres.

La meilleure partie de byobu est que vous n'avez pas à tuer les processus en cours d'exécution dans le terminal pour quitter le terminal. Vous pouvez simplement envoyer l'écran / tmux (le squelette de byobu) à l'arrière-plan et reprendre la prochaine fois que vous viendrez:

  • Pour quitter byobu et le maintenir en marche, appuyez sur F6.
  • La prochaine fois que tu viendras, fais juste byobu et toi, sholud, reviens là où tu étais.

    byobu-detach-attach

Vous pouvez également créer différentes sessions byobu en byobu -S session1 etc. Et vous pouvez vous connecter à l'un d'eux à votre retour.

Vous pouvez faire beaucoup plus en utilisant Byobu. Utilise le! Certains guides définitifs sont ici, ici ou ici.


19
2017-11-24 22:09



J'ai essayé d'utiliser byobu à partir d'une session basée sur PuTTY sur ma boîte Ubuntu, mais la ligne d'état se répète et défile à l'écran. Bien qu'il se soit détaché correctement en appuyant sur F6, ce n'était pas une solution utilisable dans ma configuration. - jfmessier
@jfmessier C'est parce que PuTTY ne prend pas bien ncurses (utf-8). Il est possible d'éliminer ce problème en suivant ce fil de discussion - stackoverflow.com/questions/10731099/… - SiddharthaRT
C'est génial! 1. il me donne une invite de couleur bash que je ne peux pas sembler activer avec bash comme mon shell par défaut et 2. je peux exécuter 2 robots en même temps et encore avoir un autre terminal sur lequel travailler! @SiddharthaRT vous méritez un vote de bienvenue! - Dev


Vous ne pouvez pas le faire une fois que le processus a démarré, vous devez avoir configuré les choses avant d'exécuter un travail de longue durée.

Vous pouvez utiliser nohup mais la sagesse moderne suggère d'utiliser l'écran ou le byobu comme identifiant pour que vous puissiez détacher et laisser fonctionner les choses.

L'écran a l'avantage de pouvoir se détacher d'une machine et de se rattacher à une autre, ce qui est pratique si vous souhaitez vérifier les processus de longue durée qui se déroulent au-delà de la journée de travail.

Il y a un démarrage raisonnable guide à l'écran ici.

byobu met une interface facile à utiliser en haut de l'écran avec les menus, etc. C'est aussi l'implémentation actuelle de l'écran sur les nouveaux ubuntu. F2 pour démarrer un nouveau terminal F3 / F4 pour basculer et F6 pour se déconnecter. Tapez exit pour terminer les terminaux en permanence.


16
2017-10-21 12:16



byobu utilise tmux ces jours-ci .. - scottl
"Vous ne pouvez pas le faire une fois que le processus a démarré, vous devez avoir configuré les choses avant de lancer un travail de longue durée." - non, vous pouvez utiliser disown pour y parvenir. Voir la réponse de @ bassgey - Rich
après avoir lutté pour apprendre l'écran et le tmux .... byobu m'a apporté les larmes aux yeux - HDave
disown et si nécessaire juste Ctrl-z, puis bg pour l'obtenir du terminal actif et à l'arrière-plan. Alors, disown. - mimoralea


Hey, alors que je suis d'accord que l'écran est l'option la plus efficace. Vous pouvez utiliser vncserver, puis lancer le processus dessus.

Aussi, si votre seul interlocuteur est d’avoir le processus en cours d’exécution et de ne plus avoir besoin de reprendre le contrôle, et le plus important, vous ne saviez pas que vous deviez fermer la session et que le processus est déjà en cours. tu as utilisé bash comme la coquille

Vous devez d'abord envoyer le processus en arrière-plan en tapant Ctrl + Z suivi de bg% 1 (le nombre dépend du numéro du travail, il est généralement égal à 1, mais vous pouvez facilement extraire la liste en utilisant les commandes).

Enfin, appelez la commande disown (suivie du jobid ... identique à la commande bg)

Cela supprimera la relation parent-enfant entre votre shell et le processus en arrière-plan, l'empêchant de mourir lorsque votre shell est terminé.


7
2018-06-06 21:29



Cette réponse est la meilleure! Pourquoi tout le monde parle screen, la question a été posée après l'événement de connexion, comment garder les processus en cours d'exécution, maintenant après la connexion, mais avant de les démarrer. Bonne réponse Jorge, tu m'as vraiment aidé! :) - jwbensley
Simplement bg (sans pour autant %1) est souvent suffisant, puisque le travail par défaut est le travail en cours - Walter Tross
Il serait bien d'avoir une réponse complète: A priori (mise en place préalable): écran terminal ascii (ancien), tmux (juste à côté); X windows: vnc (ancien, toujours maintenu), xpra (plus récent), xpra étant sans racine. Un postérieur (persistant après que tu aies commencé): ^ Z, renié, ... Mais je suis trop paresseux pour le compléter plus que cela. - Krazy Glew


Pour un script shell unique que je cours sur une longue période, je vais me connecter et exécuter le processus en arrière-plan à l'aide de «&».

Exemple:

/path/to/my/script &

Je me suis déconnecté et j'ai déconnecté ma session SSH. Lorsque je me connecte un peu plus tard, le script est toujours en cours d'exécution, comme le prouve la collecte continue de données à partir du script.


7
2017-07-29 14:58



Oui, j'aimerais savoir comment screen / tmux est meilleur que cette solution simple. - Mads Skjern
Oui, je le vois aussi sur mon ubuntu, mais cela ne devrait pas se passer en théorie. Je ne comprends pas pourquoi - Daniel Pinyol
@MadsSkjern Parce que vous ne pouvez entrer aucune entrée dans le script en utilisant cette méthode. - Ken Sharp
@MadsSkjern la raison est que si vous exécutez des processus comme celui-ci avec & si vous vous déconnectez et que vous vous connectez à votre session SSH, le processus sera toujours fonctionnement Cependant, vous ne pourrez pas voir le sortiede ce processus (si votre script a fait écho à quelque chose que vous ne le verrez pas, mais s'il écrit un fichier, le fichier sera là) - DarkCygnus