Comment exécuter et contrôler les processus d’arrière-plan sous Linux

Utilisez le shell Bash sous Linux pour gérer les processus de premier plan et d’arrière-plan. Vous pouvez utiliser les fonctions de contrôle des travaux et les signaux de Bash pour vous donner plus de flexibilité dans la façon dont vous exécutez les commandes. Nous vous montrons comment.

Tout sur les processus

Chaque fois qu’un programme est exécuté dans un système d’exploitation de type Linux ou Unix, un processus est lancé. «Process» est le nom de la représentation interne du programme en cours d’exécution dans la mémoire de l’ordinateur. Il existe un processus pour chaque programme actif. En fait, il existe un processus pour presque tout ce qui s’exécute sur votre ordinateur. Cela inclut les composants de votre environnement de bureau graphique (GDE) comme GNOME ou KDEet système démons qui sont lancés au démarrage.

Pourquoi presque tout ce qui tourne? Eh bien, les éléments intégrés de Bash tels que CD, pwd, et alias n’ont pas besoin d’avoir un processus lancé (ou «engendré») lorsqu’ils sont exécutés. Bash exécute ces commandes dans l’instance du shell Bash qui s’exécute dans la fenêtre de votre terminal. Ces commandes sont rapides précisément parce qu’elles n’ont pas besoin de lancer un processus pour s’exécuter. (Vous pouvez taper help dans une fenêtre de terminal pour voir la liste des fonctions intégrées de Bash.)

Les processus peuvent s’exécuter au premier plan, auquel cas ils prennent le contrôle de votre terminal jusqu’à ce qu’ils soient terminés, ou ils peuvent être exécutés en arrière-plan. Les processus qui s’exécutent en arrière-plan ne dominent pas la fenêtre du terminal et vous pouvez continuer à y travailler. Ou du moins, ils ne dominent pas la fenêtre du terminal s’ils ne génèrent pas de sortie d’écran.

Un exemple désordonné

Nous allons commencer un simple ping trace en cours d’exécution. Nous allons envoyer une requête ping au domaine toptips.fr. Cela s’exécutera comme un processus de premier plan.

ping www.howtogeek.com

ping www.howtogeek.com dans une fenêtre de terminal

Nous obtenons les résultats attendus en faisant défiler la fenêtre du terminal. Nous ne pouvons rien faire d’autre dans la fenêtre du terminal pendant l’exécution du ping. Pour terminer la commande, appuyez sur Ctrl + C.

Ctrl+C

sortie de trace ping dans une fenêtre de terminal

L’effet visible de Ctrl + C est mis en évidence dans la capture d’écran. ping donne un bref résumé puis s’arrête.

Répétons cela. Mais cette fois, nous allons appuyer sur Ctrl + Z au lieu de Ctrl + C. La tâche ne sera pas terminée. Cela deviendra une tâche d’arrière-plan. Nous obtenons le contrôle de la fenêtre du terminal qui nous est retournée.

ping www.howtogeek.com
Ctrl+Z

effet de Ctrl + Z sur une commande exécutée dans une fenêtre de terminal

L’effet visible de la pression sur Ctrl + Z est mis en évidence dans la capture d’écran.

Cette fois, on nous dit que le processus est arrêté. Arrêté ne veut pas dire terminé. C’est comme une voiture à un panneau d’arrêt. Nous ne l’avons pas mis au rebut ni jeté. Il est toujours sur la route, à l’arrêt, attendant de partir. Le processus est maintenant un travail d’arrière-plan.

  Comment modifier les paramètres de détection de mouvement sur Google Pixel 4 et Pixel 4 XL

La commande jobs listera les emplois qui ont été démarrées dans la session de terminal en cours. Et comme les jobs sont (inévitablement) des processus, nous pouvons également utiliser la commande ps pour les voir. Utilisons les deux commandes et comparons leurs sorties. Nous utiliserons l’option T option (terminal) pour répertorier uniquement les processus en cours d’exécution dans cette fenêtre de terminal. Notez qu’il n’est pas nécessaire d’utiliser un trait d’union – avec l’option T.

jobs
ps T

commande jobs dans une fenêtre de terminal

La commande jobs nous dit:

[1]: Le nombre entre crochets est le numéro de la tâche. Nous pouvons l’utiliser pour faire référence au travail lorsque nous devons le contrôler avec des commandes de contrôle de travail.
+: Le signe plus + montre que c’est la tâche qui sera exécutée si nous utilisons une commande de contrôle de tâche sans numéro de tâche spécifique. C’est ce qu’on appelle le travail par défaut. Le travail par défaut est toujours celui qui a été le plus récemment ajouté à la liste des travaux.
Arrêté: le processus n’est pas en cours d’exécution.
ping www.howtogeek.com: la ligne de commande qui a lancé le processus.

La commande ps nous dit:

PID: ID de processus du processus. Chaque processus a un identifiant unique.
TTY: Le pseudo-télétype (fenêtre de terminal) à partir duquel le processus a été exécuté.
STAT: le statut du processus.
TIME: la quantité de temps CPU consommé par le processus.
COMMANDE: la commande qui a lancé le processus.

Voici les valeurs courantes de la colonne STAT:

D: sommeil ininterrompu. Le processus est dans un état d’attente, généralement en attente d’entrée ou de sortie, et ne peut pas être interrompu.
I: Idle.
R: En cours d’exécution.
S: sommeil interruptible.
T: Arrêté par un signal de contrôle de tâche.
Z: Un processus zombie. Le processus a été arrêté mais n’a pas été «nettoyé» par son processus parent.

La valeur de la colonne STAT peut être suivie de l’un de ces indicateurs supplémentaires:

<: high-priority="" task="" nice="" to="" other="" processes="" n:="" low-priority="" l:="" process="" has="" pages="" locked="" into="" memory="" used="" by="" real-time="" s:="" a="" session="" leader.="" leader="" is="" that="" launched="" groups.="" shell="" multi-thread="" process.="" foreground="">Nous pouvons voir que Bash a un état de Ss. Le «S» majuscule nous indique que le shell Bash est en veille et qu’il est interruptible. Dès que nous en aurons besoin, il répondra. Le «s» minuscule nous indique que le shell est un leader de session.

La commande ping a un état de T. Cela nous indique que le ping a été arrêté par un signal de contrôle de tâche. Dans cet exemple, c’était le Ctrl + Z que nous avons utilisé pour le mettre en arrière-plan.

La commande ps T a un état de R, qui signifie exécution. Le + indique que ce processus est membre du groupe de premier plan. La commande ps T s’exécute donc au premier plan.

La commande bg

La commande bg est utilisée pour reprendre un processus en arrière-plan. Il peut être utilisé avec ou sans numéro de travail. Si vous l’utilisez sans numéro de tâche, la tâche par défaut est mise au premier plan. Le processus s’exécute toujours en arrière-plan. Vous ne pouvez y envoyer aucune entrée.

Si nous émettons la commande bg, nous reprendrons notre commande ping:

bg

bg dans une fenêtre de terminal

La commande ping reprend et nous voyons à nouveau la sortie de défilement dans la fenêtre du terminal. Le nom de la commande qui a été redémarrée s’affiche pour vous. Ceci est mis en évidence dans la capture d’écran.

  Comment faire fonctionner Kanboard sur votre serveur Linux

reprise du processus de ping en arrière-plan avec sortie dans une veuve de terminal

Mais nous avons un problème. La tâche s’exécute en arrière-plan et n’acceptera pas d’entrée. Alors, comment pouvons-nous l’arrêter? Ctrl + C ne fait rien. Nous pouvons le voir lorsque nous le tapons, mais la tâche d’arrière-plan ne reçoit pas ces frappes, donc elle continue de cingler joyeusement.

Tâche d'arrière-plan ignorant Ctrl + C dans une fenêtre de terminal

En fait, nous sommes maintenant dans un étrange mode mixte. Nous pouvons taper dans la fenêtre du terminal mais ce que nous tapons est rapidement balayé par la sortie de défilement de la commande ping. Tout ce que nous tapons prend effet dans l’avant-plan.

Pour arrêter notre tâche d’arrière-plan, nous devons la mettre au premier plan, puis l’arrêter.

La commande fg

La commande fg amènera une tâche d’arrière-plan au premier plan. Tout comme la commande bg, elle peut être utilisée avec ou sans numéro de tâche. Son utilisation avec un numéro de travail signifie qu’il fonctionnera sur un travail spécifique. S’il est utilisé sans numéro de travail, la dernière commande envoyée en arrière-plan est utilisée.

Si nous tapons fg, notre commande ping sera mise au premier plan. Les caractères que nous tapons sont mélangés avec la sortie de la commande ping, mais ils sont exploités par le shell comme s’ils avaient été entrés sur la ligne de commande comme d’habitude. Et en fait, du point de vue du shell Bash, c’est exactement ce qui s’est passé.

fg

commande fg mélangée avec la sortie de ping dans une fenêtre de terminal

Et maintenant que la commande ping est à nouveau exécutée au premier plan, nous pouvons utiliser Ctrl + C pour la tuer.

Ctrl+C

Ctrl + C arrêt de la commande ping dans une fenêtre de terminal

Nous devons envoyer les bons signaux

Ce n’était pas vraiment joli. Il est évident que l’exécution d’un processus en arrière-plan fonctionne mieux lorsque le processus ne produit pas de sortie et ne nécessite pas d’entrée.

Mais, désordonné ou non, notre exemple a accompli:

Mettre un processus en arrière-plan.
Restauration du processus à un état en cours d’exécution en arrière-plan.
Remettre le processus au premier plan.
Mettre fin au processus.

Lorsque vous utilisez Ctrl + C et Ctrl + Z, vous envoyez des signaux au processus. Ceux-ci sont sténographie d’utiliser la commande kill. Il y a 64 signaux différents que tuer peut envoyer. Utilisez kill -l sur la ligne de commande pour les lister. kill n’est pas la seule source de ces signaux. Certains d’entre eux sont générés automatiquement par d’autres processus au sein du système

Voici quelques-uns des plus couramment utilisés.

SIGHUP: Signal 1. Envoyé automatiquement à un processus lorsque le terminal dans lequel il s’exécute est fermé.
SIGINT: Signal 2. Envoyé à un processus, vous appuyez sur Ctrl + C. Le processus est interrompu et dit de se terminer.
SIGQUIT: Signal 3. Envoyé à un processus si l’utilisateur envoie un signal d’arrêt Ctrl + D.
SIGKILL: Signal 9. Le processus est immédiatement tué et ne tentera pas de se fermer proprement. Le processus ne se déroule pas avec élégance.
SIGTERM: Signal 15. C’est le signal par défaut envoyé par kill. C’est le signal de fin de programme standard.
SIGTSTP: Signal 20. Envoyé à un processus lorsque vous utilisez Ctrl + Z. Il arrête le processus et le met en arrière-plan.

  À quelle fréquence Google met-il à jour Chrome?

Nous devons utiliser la commande kill pour émettre des signaux auxquels aucune combinaison de touches ne leur est attribuée.

Contrôle supplémentaire des travaux

Un processus déplacé en arrière-plan à l’aide de Ctrl + Z est placé à l’état arrêté. Nous devons utiliser la commande bg pour le redémarrer. Lancer un programme en tant que processus d’arrière-plan en cours d’exécution est simple. Ajoutez une esperluette & à la fin de la ligne de commande.

Bien qu’il soit préférable que les processus d’arrière-plan n’écrivent pas dans la fenêtre du terminal, nous allons utiliser des exemples qui le font. Nous devons avoir quelque chose dans les captures d’écran auquel nous pouvons nous référer. Cette commande démarrera une boucle sans fin comme processus d’arrière-plan:

tandis que vrai; faire écho « toptips.fr Loop Process »; dormir 3; terminé &

tandis que vrai; faire écho

On nous indique le numéro de travail et l’ID de processus du processus. Notre numéro de travail est 1 et l’identifiant de processus est 1979. Nous pouvons utiliser ces identificateurs pour contrôler le processus.

La sortie de notre boucle sans fin commence à apparaître dans la fenêtre du terminal. Comme précédemment, nous pouvons utiliser la ligne de commande, mais toutes les commandes que nous émettons sont entrecoupées de la sortie du processus de boucle.

ls

sortie du processus de boucle d'arrière-plan entrecoupée de sortie d'autres commandes

Pour arrêter notre processus, nous pouvons utiliser des jobs pour nous rappeler quel est le numéro de job, puis utiliser kill.

jobs rapporte que notre processus est le job numéro 1. Pour utiliser ce nombre avec kill, nous devons le faire précéder d’un signe de pourcentage%.

jobs
kill %1

jobs et tuer% 1 dans une fenêtre de terminal

kill envoie le signal SIGTERM, numéro de signal 15, au processus et il est terminé. Lors de la prochaine pression sur la touche Entrée, un statut du travail s’affiche. Il répertorie le processus comme «terminé». Si le processus ne répond pas à la commande kill, vous pouvez monter d’un cran. Utilisez kill avec SIGKILL, signal numéro 9. Il suffit de mettre le numéro 9 entre la commande kill et le numéro de travail.

kill 9 %1

Choses que nous avons couvertes

Ctrl + C: envoie SIGINT, signal 2, au processus – s’il accepte une entrée – et lui dit de se terminer.
Ctrl + D: envoie SISQUIT, signal 3, au processus – s’il accepte une entrée – et lui dit de quitter.
Ctrl + Z: envoie SIGSTP, signal 20, au processus et lui dit de s’arrêter (suspendre) et de devenir un processus d’arrière-plan.
jobs: répertorie les jobs d’arrière-plan et affiche leur numéro de job.
bg numéro_travail: redémarre un processus d’arrière-plan. Si vous ne fournissez pas de numéro de travail, le dernier processus qui a été transformé en tâche d’arrière-plan est utilisé.
fg numéro_travail: place un processus d’arrière-plan au premier plan et le redémarre. Si vous ne fournissez pas de numéro de travail, le dernier processus qui a été transformé en tâche d’arrière-plan est utilisé.
ligne de commande &: L’ajout d’une esperluette & à la fin d’une ligne de commande exécute cette commande en tant que tâche d’arrière-plan, qui est en cours d’exécution.
kill% job_number: envoie SIGTERM, signal 15, au processus pour le terminer.
kill 9% numéro_travail: envoie SIGKILL, signal 9, au processus et le termine brusquement.