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

  • Dave McKay

    @TheGurkha

  • septembre 24, 2019, 8:00AM EDT
Fatmawati Achmad Zaenuri/.com

utilisez le shell Bash sous Linux pour gérer les processus de premier plan et D’arrière-plan. Vous pouvez utiliser les fonctions et signaux de contrôle des tâches 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 démarré., « Processus” 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 est en cours d’exécution sur votre ordinateur. Cela inclut les composants de votre environnement de bureau graphique (GDE) tels que GNOME ou KDE, et les démons système lancés au démarrage.

Pourquoi presque tout ce qui est en cours d’exécution? Eh bien, les éléments intégrés 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 d’avoir un processus lancé pour qu’elles s’exécutent. (Vous pouvez taperhelp dans une fenêtre de terminal pour voir la liste des éléments intégrés à Bash.)

publicité

Les processus peuvent être exécutés au premier plan, auquel cas ils prennent en charge 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 une simpleping trace en cours d’exécution. Nous allons ping le domaine How-To Geek. Cela s’exécutera en tant que processus de premier plan.

ping www.howtogeek.com

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 que ping est en cours d’exécution., Pour terminer la commande, cliquez sur Ctrl+C.

Ctrl+C

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

publicité

répétons-le. Mais cette fois, nous allons frapper Ctrl+Z au lieu de Ctrl+C. La tâche ne sera pas terminée. Cela deviendra une tâche de fond. Le contrôle de la fenêtre du terminal nous est rendu.,

ping www.howtogeek.com
Ctrl+Z

L’effet visible de la frappe de 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 signifie pas terminé. C’est comme une voiture à un panneau d’arrêt. Nous ne l’avons pas mis au rebut et jeté. Il est toujours sur la route, immobile, en attente d’aller. Le processus est maintenant un travail de fond.

la commande jobs répertorie les tâches qui ont été démarrées dans la session de terminal en cours., Et parce que les travaux 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’optionT option (terminal) pour lister 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 la balise T option.

jobs
ps T

Le jobs commande nous dit:

  • : Le nombre entre crochets est le numéro de job., Nous pouvons l’utiliser pour faire référence à la tâche lorsque nous devons la contrôler avec des commandes de contrôle de tâche.
  • +: Le signe plus+ montre que c’est le travail qui sera exécuté si nous utilisons une commande de contrôle de travail sans numéro de travail spécifique. C’est ce qu’on appelle le travail par défaut. La tâche par défaut est toujours celle qui a été ajoutée le plus récemment à la liste des tâches.
  • 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.,

Le ps commande nous dit:

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

Ce sont des valeurs communes pour 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.,
  • j’: Inactif.
  • R: en cours d’exécution.
  • s: sommeil Interruptible.
  • T: Arrêté par un signal de commande.
  • Z: un processus zombie. Le processus a été terminé mais n’a pas été « nettoyé” par son processus parent.
publicité

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

  • <: tâche hautement prioritaire (pas agréable pour les autres processus).
  • N: faible priorité (agréable pour les autres processus).
  • L: le processus a des pages verrouillées en mémoire (généralement utilisées par les processus en temps réel).,
  • s: Un animateur de la séance. Un leader de session est un processus qui a lancé des groupes de processus. Un shell est un leader de session.
  • l: processus Multi-thread.
  • +: Un processus de premier plan.

On peut voir que Bash a un état de Ss. Les  » s  » majuscules nous indiquent que le shell Bash dort 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 ping a été arrêté par un signal de contrôle de tâche. Dans cet exemple, c’était le Ctrl+Z que nous avions l’habitude de mettre en arrière-plan.

la commandeps Ta un ÉtatR, qui signifie en cours d’exécution. Le + indique que ce processus est un membre du groupe de premier plan. Ainsi, la commandeps T s’exécute au premier plan.

la commande bg

la commandebg 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 travail, le travail par défaut est mis au premier plan. Le processus s’exécute toujours en arrière-plan. Vous ne pouvez pas lui envoyer d’entrée.

Annonce

Si nous le problème de la balise bg commande, nous allons reprendre notre ping commande:

bg

Le ping commande reprend et nous voyons le défilement de sortie dans la fenêtre de terminal, une fois de plus. 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.

Mais nous avons un problème. La tâche s’exécute en arrière-plan et n’accepte pas les entrées. 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, elle continue donc à pinger joyeusement.

publicité

En fait, nous sommes maintenant dans un étrange mode mélangé. 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 le foregound.,

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

la commande fg

lafg 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 travail. De l’utiliser 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 taponsfg notre commandeping 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 de Bash shell, c’est exactement ce qui s’est passé.

fg
Annonce

Et maintenant que nous avons le ping course de commande à l’avant-plan une fois de plus, on peut utiliser Ctrl+C le tuer.

Ctrl+C

nous devons envoyer les bons signaux

ce n’était pas vraiment joli., Évidemment, 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.
  • restaurer le processus à un État d’exécution en arrière-plan.
  • renvoyant le processus au premier plan.
  • terminer le processus.

Lorsque vous utilisez la balise Ctrl+C et Ctrl+Z , vous envoyer des signaux aux processus. Ce sont des moyens abrégés d’utiliser la commande kill., Il existe 64 signaux différents que kill 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 déclenchés automatiquement par d’autres processus au sein du système

Voici quelques-uns des les 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 que vous avez frappé Ctrl+C. Le processus est interrompu et dit de se terminer.,
  • SIGQUIT: Signal 3. Envoyé à un processus si l’utilisateur envoie un signal de sortie Ctrl+D.
  • SIGKILL: Signal 9. Le processus est immédiatement tué et ne tentera pas de se fermer proprement. Le processus ne descend pas gracieusement.
  • SIGTERM: Signal 15. C’est le signal par défaut envoyé par kill. C’est le signal de terminaison 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.,

Nous devons utiliser la balise kill commande pour émettre des signaux qui n’ont pas de combinaisons de touches assignées.

contrôle ultérieur du travail

un processus déplacé en arrière-plan à l’aide deCtrl+Z est placé à l’état arrêté. Nous devons utiliser la commandebg pour le redémarrer. Pour lancer un programme comme un processus d’arrière-plan en cours d’exécution est simple. Ajouter une esperluette & à la fin de la ligne de commande.,

Advertisement

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 auxquelles nous pouvons nous référer. Cette commande va démarrer une boucle sans fin en tant que processus d’arrière-plan:

while true; do echo « How-To Geek Loop Process”; sleep 3; done &

on nous dit le numéro de travail et l’ID de processus id du processus. Notre numéro de travail est 1, et l’id de processus est 1979. Nous pouvons utiliser ces identifiants pour contrôler le processus.,

Annonce

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

Pour arrêter de notre processus, nous pouvons utiliser des jobs pour nous rappeler ce que le nombre d’emplois est, et ensuite utiliser kill.

jobs indique que notre processus est le travail Numéro 1. Pour utiliser ce numéro avec kill nous devons faites-la précéder d’un signe de pourcentage %.,

jobs
kill %1

kill envoie le SIGTERM signal, le signal numéro 15, le processus et qu’il est terminé. Lorsque la touche entrée est ensuite enfoncée, un État de la tâche s’affiche. Il répertorie le processus comme  » terminé. »Si le processus ne répond pas à la commande kill, vous pouvez le monter d’un cran. Utilisez killavecSIGKILL, numéro de signal 9. Il suffit de mettre le numéro 9 entre la commande kill le numéro du travail.,

kill 9 %1

choses que nous avons couvertes

  • Ctrl+C: envoieSIGINT, signal 2, au processus—s’il accepte l’entrée—et lui dit de se terminer.
  • Ctrl + D: envoie SISQUIT, signal 3, au processus—s’il accepte l’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.
  • tâches: répertorie les tâches d’arrière-plan et affiche leur numéro de tâche.
  • BG job_number: redémarre un processus en arrière-plan., Si vous ne fournissez pas de numéro de tâche, le dernier processus transformé en tâche d’arrière-plan est utilisé.
  • FG job_number: apporte un processus d’arrière-plan au premier plan et le redémarre. Si vous ne fournissez pas de numéro de tâche, le dernier processus transformé en tâche d’arrière-plan est utilisé.
  • ligne de commande &: Ajouter une esperluette & à la fin d’une ligne de commande exécute la commande en tâche de fond, qui est en cours d’exécution.
  • kill %job_number: envoieSIGTERM, signal 15, au processus pour le terminer.,
  • kill 9% job_number: envoie SIGKILL, signal 9, au processus et le termine brusquement.

EN RELATION: Comment tuer les processus à partir du Terminal Linux

Dave McKay
Dave McKay a utilisé pour la première fois des ordinateurs lorsque la bande de papier perforé était en vogue, et il a depuis programmé. Après plus de 30 ans dans l’industrie informatique, il est maintenant journaliste technologique à temps plein., Au cours de sa carrière, il a travaillé en tant que programmeur indépendant, responsable d’une équipe internationale de développement de logiciels, chef de projet de services informatiques et, plus récemment, en tant que délégué à la Protection des données. Dave est un évangéliste Linux et un défenseur de l’open source.Lire l’Intégrale « 

Leave a Comment