Recherche de site Web

Détacher le processus du parent sous Linux


Chaque programme que vous exécutez à partir de votre shell fonctionnel est, pour le système Linux, considéré comme un processus. Chaque processus, à l’exception de l’initial, a son parent identifié par PPID (ID de processus parent). Lorsque vous démarrez un processus à l’aide de votre interpréteur de commandes actuel, l’interpréteur de commandes lui-même devient un parent de votre processus nouvellement démarré. Le problème avec cette approche est que cela n’est pas toujours souhaitable, car lorsque le processus parent est terminé, son enfant meurt avec lui.

Cela signifie que la fermeture de votre shell actuel mettra fin aux processus enfants à l’intérieur de celui-ci. Ce n’est pas idéal dans certaines situations, car cela vous obligerait à maintenir le terminal ou la session SSH en vie afin de ne pas arrêter les processus fils qui s’exécutent en son sein. Après s’être déconnecté de votre terminal, le shell parent est terminé, mettant ainsi fin à tous les processus dérivés. Dans ce tutoriel, nous allons explorer quelques méthodes pour détacher un processus de son parent sous Linux.

Dans ce tutoriel, vous allez apprendre :

  • Comment détacher un processus enfant avec les commandes par défaut disown et nohup
  • Comment mettre un processus en arrière-plan et le rappeler au premier plan
  • Comment détacher un processus enfant avec les commandes installables at et screen

Détachez le processus en le plaçant en arrière-plan

Lorsque vous exécutez une commande qui souhaite continuer à s’exécuter pendant une longue période, le problème est que votre terminal actuel est dédié à la commande. Vous ne pouvez pas continuer à utiliser le terminal, et vous ne pouvez pas non plus le fermer, car cela mettrait fin à la commande en cours d’exécution.

Si vous avez une commande en cours d’exécution et que vous devez la mettre en arrière-plan pour libérer votre terminal, vous pouvez appuyer sur Ctrl + Z sur votre clavier pour arrêter le processus. Voici un exemple.


sleep 10000
^Z
[1]+  Stopped                 sleep 10000

Pour afficher la liste des travaux en arrière-plan, utilisez la commande travaux.


jobs -l
[1]+  1650 Stopped                 sleep 10000

Pour remettre une tâche au premier plan, nous pouvons utiliser la commande fg.


fg

Si nous avions plusieurs tâches arrêtées, nous devrions utiliser un signe de pourcentage et spécifier l’ID de la tâche pour ramener la tâche appropriée au premier plan.


fg %1

Super, maintenant nous pouvons mettre les processus en arrière-plan et les ramener quand nous le voulons plus tard. Mais que se passe-t-il si nous voulons que la commande continue à s’exécuter pendant qu’elle est en arrière-plan ? Pour cela, nous pouvons utiliser la commande bg, suivie d’une esperluette et de l’ID de la tâche. La commande suivante fera reprendre notre travail arrêté, tout en le gardant en arrière-plan.


bg %1
[1]+ sleep 10000 &

Maintenant, nous pouvons voir que le processus est toujours en arrière-plan, mais il affiche un statut « en cours d’exécution » au lieu de « arrêté ». ”


jobs -l
[1]+  1650 Running                 sleep 10000 &

Il y a encore une chose à garder à l’esprit. Vous ne pouvez pas fermer votre terminal actuel, sinon ces travaux d’arrière-plan seront fermés. Si vous devez fermer votre terminal et que vous ne voulez pas que ces commandes s’arrêtent, vous devez « désavouer » le ou les travaux. Si vous n’avez qu’une seule tâche en arrière-plan, la commande suivante fonctionnera :


disown

Si vous en avez plusieurs, vous devez spécifier l’ID de la tâche.


disown %1

Vous ne verrez plus le travail dans votre table des travaux lorsque vous exécutez la commande jobs. Maintenant, il est sûr de fermer le terminal et votre commande continuera à s’exécuter.


jobs -l

Vous pouvez toujours garder un œil sur votre commande en cours d’exécution à l’aide de la commande ps.


ps aux | grep sleep
linuxco+    1650  0.0  0.0   8084   524 pts/0    S    12:27   0:00 sleep 10000

Et si vous souhaitez arrêter l’exécution de la commande, vous pouvez utiliser la commande kill et spécifier l’ID du processus.


kill 1650

Nous avons maintenant vu comment mettre un processus en cours d’exécution en arrière-plan et le rappeler plus tard. Mais nous avons également la possibilité de démarrer la commande en arrière-plan au début. Tout ce que vous avez à faire est de mettre une esperluette à la fin de n’importe quelle commande Linux.


sleep 10000 &
[1] 1900

Tout comme précédemment, nous pouvons voir le travail répertorié avec la commande jobs. Cette fois, cependant, le travail est déjà en cours d’exécution et nous n’avons pas eu à le démarrer manuellement en arrière-plan.


jobs -l
[1]+  1900 Running                 sleep 10000 &

Détachez le processus et maintenez-le en marche avec nohup

Nous avons déjà vu dans un exemple précédent comment nous pouvons utiliser la commande disown pour nous assurer que la commande continue de s’exécuter après la fermeture de notre terminal. Une autre option est la commande nohup.

nohup indique à un processus d’ignorer tous les signaux SIGHUP (raccrocher) qu’il reçoit. Le signal SIGHUP est envoyé à une tâche d’arrière-plan chaque fois que le terminal actuel est fermé. Ainsi, nous pouvons avoir une tâche en arrière-plan, fermer le terminal et la voir toujours fonctionner en arrière-plan. Voici un exemple.


nohup sleep 10000 &
[1] 1908
nohup: ignoring input and appending output to 'nohup.out'

Nous avons fermé le terminal et l’avons rouvert, puis nous avons exécuté la commande suivante, ce qui montre que la commande est toujours en cours d’exécution.


ps aux | grep sleep
linuxco+    1908  0.0  0.0   8084   524 ?        S    13:05   0:00 sleep 10000

Utilisation de la commande d’écran

Jusqu’à présent, nous avons couvert les méthodes Linux par défaut pour exécuter des commandes en arrière-plan. Cependant, il existe également des progiciels supplémentaires qui peuvent être utilisés. La plus populaire serait peut-être la commande d’écran. Consultez ce lien pour obtenir des instructions d’installation et des instructions d’utilisation détaillées.

Plutôt que d’attacher un processus enfant à votre terminal actuel, nous pouvons l’attacher à un autre processus à la place. Attacher un processus à une session « écran » nous permettra de le détacher de notre terminal actuel, ce qui nous permettra de nous déconnecter de la session SSH ou de fermer complètement le terminal, sans arrêter le processus en cours.

Voici comment cela fonctionne :

  1. Exécutez la commande screen pour démarrer un nouvel « écran ». Si vous le souhaitez, incluez l’option -S pour lui donner un nom.

    
    screen -S mycommand
    
  2. Dans la nouvelle session d’écran (attachée automatiquement lors de la création), exécutez la commande ou le script que vous souhaitez mettre en arrière-plan.

    
    /path/to/myscript.sh
    
  3. Appuyez sur Ctrl + A sur votre clavier, puis sur D. Cela détachera l’écran, puis vous pourrez fermer le terminal, vous déconnecter de votre session SSH, etc., et l’écran persistera. Pour afficher la liste des écrans, utilisez cette commande.

    
    screen -ls
    There is a screen on:
    	2741.mycommand	(05/11/2022 01:13:24 PM)	(Detached)
    1 Socket in /run/screen/S-linuxconfig.
    
  4. Pour le rattacher à un écran, utilisez la commande suivante, en remplaçant le numéro ci-dessous par votre propre ID de processus.

    
    screen -r 2741
    

Détacher le processus avec la commande at

Peut-être qu’un moyen encore plus simple de détacher votre processus de la coquille de travail actuelle est d’utiliser la commande at (voir l’article lié pour les instructions d’installation).

L’exemple ci-dessous illustre comment exécuter un travail, dans ce cas la commande yes, puis détacher ce processus du shell de travail actuel.


at now
at> yes > /dev/null
at> 
job 2 at Thu May 09 11:12:00 2022

Sur la première ligne, nous avons commencé la commande at avec l’argument time maintenant. Ensuite, nous tapons la commande que nous souhaitons exécuter. Enfin, en appuyant sur la combinaison de touches CTRL + D, nous envoyons un signal EOT (End Of Text) indiquant que nous avons terminé d’émettre des commandes et que le travail commencera immédiatement. La liste des tâches actuelles à l’aide de la commande jobs ne produira aucun résultat, ce qui signifie que nous sommes libres de nous désengager de notre shell actuel sans arrêter aucun processus.

Réflexions finales

Dans ce tutoriel, nous avons vu comment détacher un processus de son processus parent sur un système Linux. La principale motivation pour détacher un processus enfant est de libérer le terminal afin qu’il puisse être fermé ou que l’utilisateur puisse se déconnecter de sa session SSH ou telnet. Il existe de nombreuses façons de détacher un processus sous Linux, avec l’écran et probablement la plus simple, mais non disponible par défaut. Si vous ne souhaitez pas installer de logiciel supplémentaire, désavouer et démarrer des tâches en arrière-plan fonctionnera bien.

Articles connexes: