web-dev-qa-db-fra.com

Comment garder les processus en cours 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?

610
Olivier Lalonde

Vous devriez rechercher des alternatives modernes telles que tmuxname__.

tmuxest supérieur à screenpour de nombreuses raisons, voici quelques exemples:

  • Windows peut être déplacé d'une session à l'autre et même lié à plusieurs sessions
  • Les fenêtres peuvent être divisées horizontalement et verticalement en volets
  • Prise en charge des terminaux UTF-8 et 256 couleurs
  • Les sessions peuvent être contrôlées à partir du shell sans qu'il soit nécessaire d'entrer une session.

Fonctionnalité de base

Pour obtenir la même fonctionnalité que celle expliquée dans le réponse recommandant screenname__, vous devez procéder comme suit:

  • ssh dans la machine distante
  • démarrer tmuxen tapant tmuxdans le shell
  • démarrez le processus souhaité dans la session tmuxcommencée
  • quittez/détachez la session tmuxen tapant Ctrl+b et alors d

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

Si vous souhaitez que plusieurs sessions s'exécutent côte à côte, vous devez nommer chaque session à l'aide de Ctrl+b et $. Vous pouvez obtenir une liste des sessions en cours d'exécution à l'aide de tmux list-sessions, puis associez-vous à une session en cours d'exécution à l'aide de la commande tmux attach-session -t 0.

tmuxpeut faire des choses beaucoup plus avancées que de gérer une seule fenêtre dans une seule session. Pour plus d'informations, consultez man tmux ou la page tmux GitHub . En particulier, voici une FAQ sur les principales différences entre screenet tmuxname__.

703
tongpu

Option 1: Nohup

Le meilleur moyen est souvent le plus simple.

Nohup long-running-command &

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

man Nohup

Option 2: bg

Si vous voulez "mettre en arrière" certaines tâches déjà en cours, votre meilleur pari est de Ctrl+Z puis courir

bg

pour mettre en arrière-plan votre tâche suspendue la plus récente, lui permettant de continuer à s'exécuter.

Ensuite, un disown rapide devrait maintenir le processus en cours après votre déconnexion.

screen et les autres peuvent le faire, mais ce n'est pas leur rôle. Je recommande Nohup pour les tâches que vous savez laisser derrière vous et bg pour les tâches que vous exécutez déjà et que vous ne souhaitez pas redémarrer.

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

284
coteyr

Vous pouvez le faire en utilisant screen.

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

Scénario simple:

  • sSH dans votre boîte à distance. Tapez screen Ensuite, démarrez le processus souhaité.

  • Presse Ctrl-A puis Ctrl-D. Cela "détachera" votre session d'écran mais laissera vos processus en cours d'exécution. Vous pouvez maintenant vous déconnecter de la boîte distante.

  • Si vous souhaitez revenir plus tard, connectez-vous à nouveau et tapez screen -r Ceci "reprend" votre session d'écran et vous pourrez voir le résultat de votre processus.

199
Lincoln

Screen et Nohup est la meilleure solution, 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 désaveu.

disown [-ar] [-h] [jobspecname__… |pidname__… ]

Sans options, supprimez chaque jobspec de la table des travaux actifs. Si l'option -h est donnée, le travail n'est pas supprimé de la table, mais est marqué de sorte que SIGHUP ne soit pas envoyé au travail si le shell reçoit un SIGHUP. Si jobspec n'est pas présent et que ni -a ni -r ne sont fournis, le travail en cours est utilisé. Si no jobspec est fourni, l'option -a signifie que vous souhaitez supprimer ou marquer tous les travaux. l'option -r sans l'argument jobspec limite les opérations aux travaux en cours.

Avec désavoué, vous pouvez fermer le terminal et lancer le processus sur la machine.

81
bassgey

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

  1. ssh [serveur]
  2. commander
  3. Ctrl+Z
  4. bg
  5. disown [processus pid facultatif, dernier par défaut]
  6. sortie

L'étape 3 met en pause le processus en cours (ma commande 'mv', par exemple).
L'étape 4 met le processus en pause à l'arrière-plan et le reprend.
L’étape 5 vous permet de désavouer le processus.** Pour obtenir une liste des tâches, tapez simplement jobsbefore.


** En ce qui concerne désaveu (du manuel bash):

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.
50
Chaos

Il existe deux programmes principaux que vous pouvez utiliser pour gérer les programmes et l’état du terminal sur plusieurs connexions ssh. Ils sont screen (l'opérateur historique, mais malheureusement non maintenu. Apparemment est activement développé à présent ) et tmux (plus récent, maintenu activement). Byobu est une interface qui peut s’appliquer par-dessus leurs systèmes et offrir des informations supplémentaires sur le statut 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 screen ou tmux.

Byobu

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

Sudo aptitude install byobu

En utilisant yum, vous faites

su -c 'yum install byobu'

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

Utilisation de byobu

Vous pouvez commencer byobu en exécutant 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 disposer facilement d'un Byobu qui fonctionne parfaitement.

Usage:

Commencez byobu en tapant byobu.

Vous pouvez appuyer sur F2 pour créer une nouvelle fenêtre dans la session en cours, sur F3-F4 pour passer d’une fenêtre à l’autre.

La meilleure chose à propos de Byobu est que vous n’avez pas à tuer réellement les processus en cours dans le terminal pour quitter le terminal. Vous pouvez simplement envoyer screen/tmux (le squelette de byobu) en arrière-plan et reprendre la prochaine fois:

  • Pour quitter Byobu et le laisser courir (détacher), appuyez sur F6.
  • La prochaine fois que vous viendrez, faites simplement byobu et revenez à votre place.

    byobu-detach-attach

Vous pouvez également créer différentes sessions byobu en byobu -S session1 et ainsi de suite. Et vous pouvez vous connecter à l'un d'eux quand vous revenez.

Vous pouvez faire beaucoup plus avec Byobu. Utilise le! Quelques guides définitifs sont ici , ou ici .

21
SiddharthaRT

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

Vous pouvez utiliser Nohup mais la sagesse moderne vous suggère d'utiliser screen ou byobu comme identifiant pour vous permettre de vous détacher et de laisser les choses en cours d'exécution.

Screen présente l’avantage de pouvoir se détacher d’une machine et se rattacher à une autre, ce qui est pratique si vous souhaitez vérifier les processus longs qui s’exécutent au-delà de la fin de la journée de travail.

Il y a une bonne façon de commencer guide à l'écran ici.

byob met une interface facile à utiliser en haut de l'écran avec des menus, etc. C'est également la mise en œuvre 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 de façon permanente.

18
Richard Holloway

Pour un script Shell unique exécuté 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 déconnecté de 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.

8
user108430

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

De plus, si votre seul intérêt est de faire fonctionner le processus sans avoir à en reprendre le contrôle, et surtout que vous ne saviez pas que vous auriez besoin de fermer la session et que le processus est déjà en cours d'exécution, vous n'avez pas de chance si vous avez utilisé bash comme Shell

Vous devez d’abord envoyer le processus à l’arrière-plan en tapant Ctrl + Z suivi de bg% 1 (le nombre dépend du numéro de travail, il s’agit généralement de 1, mais vous pouvez facilement extraire la liste à l’aide de la commande jobs).

Enfin, invoquez la commande disown (suivie de la 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 arrêté.

8
Jorge Gutierrez

Vous devriez vérifier écran GN et voir si cela vous aide. En fonction de la manière dont vous avez besoin que votre application s'exécute en temps réel, le nombre de problèmes générés peut être supérieur à sa résolution, mais au moins, cela vous permettra de reprendre votre session comme si vous ne l'aviez jamais quittée.

Comment utiliser :

  • Utilisez la commande screenpour le premier démarrage, faites défiler les messages d'introduction, vous devriez recevoir un terminal.
  • C-a C-c ouvre un autre terminal
  • C-a C-k tue un terminal
  • Vous pouvez utiliser C-a C-Space et C-a C-Backspace pour parcourir les terminaux
  • C-a C-a est pratique si vous utilisez principalement deux terminaux
  • C-a C-d détache la session d'écran en cours et quitte les écrans. Vous pouvez ensuite utiliser screen -r pour reprendre cette session. Vous pouvez avoir plusieurs sessions d'écran séparées à la fois. Dans ce cas, une liste des sessions disponibles s'affiche.

Il existe de nombreuses autres options, par exemple des écrans divisés, et tous les raccourcis sont entièrement personnalisables.

4
T. Verron

Réponse la plus simple ...

ctrl + z suspendra le programme en cours

"bg" le lancera en arrière plan

3
Roop

Le moyen le plus simple consiste à exécuter votre commande en arrière-plan avec &. Ensuite, écrivez simplement:

disown -a
3
Zibri

Alors que tout le monde dit d'utiliser disown(la seule option possible après le démarrage du processus), Nohupou même d'exécuter la commande dans screenname__, ce qui est utile si vous voulez voir tout le résultat de la commande ... Je suis un fan de screen.. J'ai toujours essayé les distributions les plus récentes de Linux. Placer simplement le travail en arrière-plan et quitter ne causent pas la mort de tous les processus en cours d'exécution. Il doit y avoir un cadre global ou quelque chose. J'essaie cela sur de très vieux systèmes (slackware 12) et mon script de test continue à s'exécuter jusqu'à ce que je le tue manuellement:

Shell$ cat > test.pl

#!/usr/bin/Perl
while(1){
     sleep(1);
}
    Shell$ Perl ./test.pl &
    Shell$ exit
    logout
    Shell$ ps aux test.pl
    mymom 31337     1  0 13:25 ?        00:00:00 Perl ./test.pl
    Shell$ 

Bien que je convienne que screenserait le meilleur moyen d’exécuter cette opération, même si mon script écrivait dans des fichiers journaux ou quoi que ce soit .. Je n’ai jamais eu besoin d’utiliser disown -a ou Nohupà moins d’être totalement paranoïa. Peut-être que quelqu'un peut nous éclairer sur le comportement par défaut de bash? Certains administrateurs système peuvent peut-être modifier les valeurs par défaut des grands shells pour empêcher les processus de leurs utilisateurs de surcharger le système?

0
Dan Gullage