GNU/Linux >> Tutoriels Linux >  >> Linux

Maintenir un processus Linux en cours d'exécution après ma déconnexion

Solution 1 :

La meilleure méthode consiste à démarrer le processus dans un multiplexeur de terminal. Vous pouvez également faire en sorte que le processus ne reçoive pas le signal HUP.

Un multiplexeur de terminaux fournit des terminaux "virtuels" qui fonctionnent indépendamment du terminal "réel" (en fait, tous les terminaux aujourd'hui sont "virtuels", mais c'est un autre sujet pour un autre jour). Le terminal virtuel continuera de fonctionner même si votre terminal réel est fermé avec votre session ssh.

Tous les processus démarrés à partir du terminal virtuel continueront à s'exécuter avec ce terminal virtuel. Lorsque vous vous reconnecterez au serveur vous pourrez vous reconnecter au terminal virtuel et tout se passera comme si de rien n'était, à part le temps qui s'est écoulé.

Screen et tmux sont deux multiplexeurs de terminaux populaires.

L'écran a une courbe d'apprentissage abrupte. Voici un bon tutoriel avec des schémas expliquant le concept :http://www.ibm.com/developerworks/aix/library/au-gnu_screen/

Le signal HUP (ou SIGHUP) est envoyé par le terminal à tous ses processus enfants lorsque le terminal est fermé. L'action commune à la réception de SIGHUP est de terminer. Ainsi, lorsque votre session ssh est déconnectée, tous vos processus se terminent. Pour éviter cela, vous pouvez faire en sorte que vos processus ne reçoivent pas SIGHUP.

Deux méthodes simples pour le faire sont nohup et disown .

Pour plus d'informations sur la façon dont nohup et disown fonctionne lire cette question et répondre :https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and

Remarque :bien que les processus continuent de fonctionner, vous ne pouvez plus interagir avec eux car ils ne sont plus attachés à aucun terminal. Cette méthode est principalement utile pour les processus batch de longue durée qui, une fois démarrés, n'ont plus besoin d'aucune intervention de l'utilisateur.

Solution 2 :

Il existe plusieurs façons de procéder, mais celle que je trouve la plus utile consiste à utiliser GNU Screen.

Après vous être connecté en ssh, exécutez screen . Cela lancera un autre shell en cours d'exécution dans l'écran. Exécutez votre commande, puis faites un Ctrl -un d .

Cela vous "déconnectera" de la session d'écran. À ce stade, vous pouvez vous déconnecter ou faire tout ce que vous souhaitez.

Lorsque vous souhaitez vous reconnecter à la session d'écran, exécutez simplement screen -RD à partir de l'invite du shell (en tant que même utilisateur qui a créé la session).

Solution 3 :

En bash , le disown mot-clé est parfaitement adapté à cela. Tout d'abord, exécutez votre processus en arrière-plan (soit utilisez & , ou ^Z puis tapez bg ):

$ wget --quiet http://server/some_big_file.zip &
[1] 1156

En tapant jobs vous pouvez voir que le processus appartient toujours au shell :

$ jobs
[1]+  Running  wget

Si vous deviez vous déconnecter à ce stade, la tâche en arrière-plan serait également supprimée. Cependant, si vous exécutez disown , bash détache la tâche et lui permet de continuer à s'exécuter :

$ disown

Vous pouvez le confirmer :

$ jobs
$ logout

Vous pouvez même combiner les & et disown sur la même ligne, comme :

$ wget --quiet http://server/some_big_file.zip & disown
$ logout

C'est mieux que d'exécuter nohup à mon avis car il ne laisse pas nohup.out fichiers éparpillés partout dans votre système de fichiers. Aussi, nohup doit être exécuté avant d'exécuter la commande — disown peut être utilisé si vous ne décidez que plus tard que vous souhaitez mettre en arrière-plan et détacher la tâche.

Solution 4 :

L'outil nohup, disponible sur la plupart des machines Linux, le fera.

Solution 5 :

Juste pour être complet, je soulignerai tmux, qui a la même idée de base que screen :

tmux est destiné à être une alternative moderne sous licence BSD aux programmes tels que GNU screen. Les fonctionnalités principales incluent :

  • Une interface de commande puissante, cohérente, bien documentée et facilement scriptable.
  • Une fenêtre peut être divisée horizontalement et verticalement en volets.
  • Les volets peuvent être librement déplacés et redimensionnés, ou organisés selon des dispositions prédéfinies.
  • Compatibilité avec les terminaux UTF-8 et 256 couleurs
  • Copiez et collez avec plusieurs tampons.
  • Menus interactifs pour sélectionner des fenêtres, des sessions ou des clients.
  • Modifier la fenêtre actuelle en recherchant du texte dans la cible.
  • Verrouillage du terminal, manuellement ou après un délai d'attente.
  • Une base de code propre, facilement extensible, sous licence BSD, en cours de développement actif.

Il est cependant approximativement infiniment plus facile de rechercher sur Google.


Linux
  1. Linux - Est-ce le processus qui a un terminal de contrôle, ou est-ce la session qui a un terminal de contrôle ?

  2. Comment arrêter un processus d'écran sous Linux?

  3. Comment tuer un processus en cours d'exécution sur un port particulier sous Linux ?

  4. Empêcher la tâche Linux en cours d'exécution d'être tuée après la déconnexion de SSH

  5. Le processus exécuté en arrière-plan a été tué sous Linux

Comment répertorier les processus en cours d'exécution sous Linux

Comment répertorier les processus en cours d'exécution sous Linux :guide du débutant

15 Commandes d'écran Linux pour traiter les sessions de terminal

Comment tuer le processus Linux en cours d'exécution sur un port particulier

Exemples de commandes d'écran :prendre le contrôle du terminal Linux/Unix

Comment effacer le terminal sous Linux {Effacer l'écran sous Linux}