Terminaison de processus Linux basée sur des motifs

LinuxBeginner
Pratiquer maintenant

Introduction

Dans les systèmes Linux, la gestion efficace des processus est essentielle pour maintenir la stabilité et les performances du système. Bien que la commande kill permette de terminer un processus en utilisant un identifiant de processus (PID - Process ID) spécifique, il existe des situations où vous devez terminer plusieurs processus en fonction de motifs. C'est là que la commande pkill devient inestimable.

Ce laboratoire (LabEx) se concentre sur l'utilisation de la commande pkill pour terminer des processus en fonction de leur nom, de leurs arguments ou d'autres critères. Vous apprendrez à identifier les processus en cours d'exécution, à les terminer de manière sélective en utilisant la correspondance de motifs et à vérifier les résultats de vos opérations. Ces compétences sont essentielles pour l'administration système et la résolution de problèmes dans les environnements Linux.

Comprendre la gestion des processus et la terminaison de processus de base

Dans cette première étape, nous allons explorer comment identifier les processus en cours d'exécution et les terminer en utilisant une correspondance de motifs de base. Linux propose plusieurs commandes pour la gestion des processus, notamment ps, pgrep et pkill.

Création de processus de test

Commençons par créer un script simple que nous pouvons exécuter en arrière - plan. Nous allons créer plusieurs instances de ce script pour simuler un scénario où vous devez terminer plusieurs processus similaires.

Tout d'abord, accédez au répertoire du projet et créez un script appelé rogue_app.sh :

cd ~/project
nano rogue_app.sh

Ajoutez le contenu suivant au script :

#!/bin/bash
while true; do
  echo "Process running with PID $$"
  sleep 5
done

Ce script exécute une boucle infinie, affichant son identifiant de processus (PID - Process ID) toutes les 5 secondes.

Maintenant, rendez le script exécutable :

chmod +x ~/project/rogue_app.sh

Exécutons plusieurs instances de ce script en arrière - plan :

for i in {1..5}; do
  ~/project/rogue_app.sh &
done

Le symbole & à la fin de la commande exécute chaque instance du script en arrière - plan, vous permettant de continuer à utiliser le terminal.

Affichage des processus en cours d'exécution

Pour voir les processus que vous venez de démarrer, utilisez la commande ps avec les options appropriées :

ps aux | grep rogue_app.sh

La sortie ressemblera à ceci :

labex     12345  0.0  0.0   2308   580 pts/0    S    10:00   0:00 /bin/bash /home/labex/project/rogue_app.sh
labex     12346  0.0  0.0   2308   580 pts/0    S    10:00   0:00 /bin/bash /home/labex/project/rogue_app.sh
labex     12347  0.0  0.0   2308   580 pts/0    S    10:00   0:00 /bin/bash /home/labex/project/rogue_app.sh
labex     12348  0.0  0.0   2308   580 pts/0    S    10:00   0:00 /bin/bash /home/labex/project/rogue_app.sh
labex     12349  0.0  0.0   2308   580 pts/0    S    10:00   0:00 /bin/bash /home/labex/project/rogue_app.sh
labex     12350  0.0  0.0   2432   584 pts/0    S+   10:00   0:00 grep --color=auto rogue_app.sh

Notez que les PID réels (les nombres dans la deuxième colonne) seront différents sur votre système.

Terminaison de processus avec pkill

Maintenant, utilisons la commande pkill pour terminer toutes les instances de notre script :

pkill -f rogue_app.sh

L'option -f indique à pkill de faire correspondre la ligne de commande complète, pas seulement le nom du processus. Cela est important car lorsqu'un script s'exécute, le nom du processus est souvent l'interpréteur (comme /bin/bash) plutôt que le nom du script.

Vérifiez que toutes les instances du script ont été terminées :

ps aux | grep rogue_app.sh

Vous devriez maintenant voir seulement la commande grep elle - même dans la sortie :

labex     12351  0.0  0.0   2432   584 pts/0    S+   10:01   0:00 grep --color=auto rogue_app.sh

Cela confirme que toutes les instances de rogue_app.sh ont été terminées avec succès.

Terminaison sélective de processus avec correspondance de motifs

Dans les scénarios réels, vous avez souvent besoin d'être plus sélectif quant aux processus à terminer. La commande pkill vous permet d'utiliser la correspondance de motifs pour cibler des processus spécifiques en fonction de divers critères.

Création de processus avec différents arguments

Créons un nouveau script que nous exécuterons avec différents arguments de ligne de commande :

cd ~/project
nano service_worker.sh

Ajoutez le contenu suivant au script :

#!/bin/bash
while true; do
  echo "Running service worker with argument: $1"
  sleep 5
done

Rendez le script exécutable :

chmod +x ~/project/service_worker.sh

Maintenant, exécutons plusieurs instances de ce script avec différents arguments :

~/project/service_worker.sh normal &
~/project/service_worker.sh normal &
~/project/service_worker.sh --malfunctioning &
~/project/service_worker.sh --malfunctioning &
~/project/service_worker.sh emergency &

Cela crée cinq processus en arrière - plan : deux travailleurs ("workers") "normaux", deux travailleurs "dysfonctionnels" et un travailleur "en urgence".

Affichage des processus avec différents arguments

Vérifiez les processus en cours d'exécution :

ps aux | grep service_worker.sh

Vous devriez voir une sortie similaire à :

labex     12360  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh normal
labex     12361  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh normal
labex     12362  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh --malfunctioning
labex     12363  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh --malfunctioning
labex     12364  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh emergency
labex     12365  0.0  0.0   2432   584 pts/0    S+   10:05   0:00 grep --color=auto service_worker.sh

Terminaison sélective avec correspondance de motifs

Maintenant, terminons sélectivement uniquement les processus avec l'argument --malfunctioning :

pkill -f "service_worker.sh --malfunctioning"

L'option -f garantit que pkill effectue la correspondance sur la ligne de commande complète, y compris les arguments.

Vérifiez que seuls les processus ciblés ont été terminés :

ps aux | grep service_worker.sh

Vous devriez maintenant voir seulement les processus "normaux" et "en urgence" :

labex     12360  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh normal
labex     12361  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh normal
labex     12364  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh emergency
labex     12366  0.0  0.0   2432   584 pts/0    S+   10:06   0:00 grep --color=auto service_worker.sh

Cela démontre comment vous pouvez terminer sélectivement des processus en fonction de motifs spécifiques dans leurs lignes de commande.

Terminons maintenant tous les processus de travailleurs de service restants :

pkill -f service_worker.sh

Vérifiez que tous les processus de travailleurs de service ont été terminés :

ps aux | grep service_worker.sh

Vous devriez maintenant voir seulement la commande grep elle - même :

labex     12367  0.0  0.0   2432   584 pts/0    S+   10:07   0:00 grep --color=auto service_worker.sh

Options avancées de terminaison de processus

Dans cette étape, nous allons explorer quelques options avancées de la commande pkill qui permettent une gestion des processus plus sophistiquée.

Utilisation de Différents Types de Signaux

Par défaut, pkill envoie le signal SIGTERM (signal 15) aux processus. Ce signal permet aux processus de se terminer proprement, en fermant les fichiers et en effectuant les opérations de nettoyage. Cependant, il existe des cas où vous pourriez vouloir utiliser un signal différent.

Créons un script qui gère les signaux :

cd ~/project
nano signal_handler.sh

Ajoutez le contenu suivant au script :

#!/bin/bash
trap 'echo "Received SIGHUP (1)"; exit 0' SIGHUP
trap 'echo "Received SIGINT (2)"; exit 0' SIGINT
trap 'echo "Received SIGTERM (15)"; exit 0' SIGTERM

echo "Process started with PID $$"
echo "Use: pkill -[signal] -f signal_handler.sh to send signals"
while true; do
  sleep 1
done

Rendez le script exécutable :

chmod +x ~/project/signal_handler.sh

Exécutez le script en arrière-plan :

~/project/signal_handler.sh &

Maintenant, essayons d'envoyer différents signaux au processus :

  1. Envoyez un signal SIGHUP (signal 1) :
pkill -HUP -f signal_handler.sh
  1. Relancez le script et envoyez SIGINT (signal 2) :
~/project/signal_handler.sh &
pkill -INT -f signal_handler.sh
  1. Relancez le script et envoyez le SIGTERM par défaut (signal 15) :
~/project/signal_handler.sh &
pkill -f signal_handler.sh ## Default is SIGTERM

Pour chaque signal, vous devriez voir le message correspondant dans la sortie du terminal avant que le processus ne se termine.

Terminer des Processus par Âge

pkill vous permet de cibler des processus en fonction de leur âge en utilisant l'option --newest, qui sélectionne les processus démarrés le plus récemment.

Créons quelques processus avec des heures de démarrage différentes :

cd ~/project
nano age_test.sh

Ajoutez le contenu suivant au script :

#!/bin/bash
while true; do
  echo "Process running with PID $$"
  sleep 5
done

Rendez le script exécutable :

chmod +x ~/project/age_test.sh

Démarrez le premier processus :

~/project/age_test.sh &

Attendez quelques secondes, puis démarrez deux processus supplémentaires :

sleep 5
~/project/age_test.sh &
~/project/age_test.sh &

Maintenant, terminons uniquement les deux processus démarrés le plus récemment en utilisant l'option --newest :

pkill -f --newest 2 age_test.sh

Vérifiez quels processus sont toujours en cours d'exécution :

ps aux | grep age_test.sh

Vous ne devriez voir que le premier processus toujours en cours d'exécution, car il a été démarré avant les deux autres processus.

Terminez le processus restant :

pkill -f age_test.sh

Limiter pkill par Propriétaire du Processus

Vous pouvez également limiter les actions de pkill aux processus appartenant à un utilisateur spécifique. Dans un système multi-utilisateur, ceci est particulièrement utile.

À des fins de démonstration, exécutons quelques processus en tant qu'utilisateur actuel :

~/project/rogue_app.sh &
~/project/rogue_app.sh &

Maintenant, terminons ces processus, mais uniquement ceux appartenant à votre utilisateur actuel :

pkill -f -u $(whoami) rogue_app.sh

L'option -u spécifie le nom d'utilisateur du propriétaire du processus. La substitution de commande $(whoami) récupère votre nom d'utilisateur actuel.

Vérifiez que tous les processus ont été terminés :

ps aux | grep rogue_app.sh

Vous ne devriez voir que la commande grep elle-même dans la sortie.

Cette capacité à cibler des processus par propriétaire est particulièrement utile dans les environnements multi-utilisateurs où vous souhaitez éviter d'affecter les processus appartenant à d'autres utilisateurs.

Résumé

Dans ce laboratoire (lab), vous avez appris à utiliser la commande pkill pour gérer les processus dans un environnement Linux. Cette commande puissante vous permet de terminer des processus en fonction de divers critères, ce qui en fait un outil essentiel pour l'administration système.

Concepts clés abordés :

  1. Terminaison de processus de base : Vous avez appris à identifier les processus en cours d'exécution à l'aide de la commande ps et à les terminer en utilisant pkill avec une correspondance de motifs de base.

  2. Terminaison sélective de processus : Vous avez exploré comment utiliser la correspondance de motifs pour cibler sélectivement des processus en fonction de leurs arguments de ligne de commande, permettant un contrôle précis sur les processus à terminer.

  3. Options avancées de terminaison de processus : Vous avez découvert les options avancées de pkill, notamment :

    • Comment envoyer différents types de signaux aux processus
    • Comment terminer des processus en fonction de leur âge
    • Comment limiter la portée de pkill aux processus appartenant à un utilisateur spécifique

Ces compétences sont précieuses pour maintenir la stabilité du système, gérer les ressources et résoudre les problèmes dans les environnements Linux. En maîtrisant la commande pkill, vous avez ajouté un outil important à votre boîte à outils d'administration système Linux.