Dans le chapitre précédent, vous avez lancé la commande w
qui vous permet d'obtenir un relevé en temps réel des comptes connectés et leurs activités associées. Cette commande effectue en fait un condensé d'autres commandes qui permettent d'auditer l'activité du processus et la charge mémoire.
Je vous propose dans ce chapitre de passer en revue les outils pour effectuer un audit de ce qui se passe en temps réel sur le système. Nous verrons :
les commandes
ps
,pstree
, ettop
et sa dérivéehtop
,la commande
kill
qui permet de terminer un processus lorsque nécessaire.
Listez les processus en cours sur le système
La commande principale pour relever l'activité des processus sur Linux est ps
.
Cette commande externe est fournie par les distributions via le package procps
. Ce package est très important, il fournit beaucoup de commandes intéressantes pour auditer l'activité du système, nous en verrons plusieurs dans ce chapitre (ps
,kill
,top
, etc.).
ps
est une commande très complète, je vous invite à consulter sa documentation, elle vous occupera un bon moment de lecture. Cependant, pour synthétiser, je vais vous présenter les combinaisons d'options que je lance régulièrement avec cette commande. Chacune de ses combinaisons ayant un objectif particulier.
Dans la vidéo suivante, je vous montre comment :
utiliser
ps
pour relever tous les processus lancés sur le système,et les filtrer par utilisateur,
ou les trier par charge CPU consommée et par volume de mémoire utilisée.
Affichez la hiérarchie des processus
Lorsque la machine démarre, Linux lance un premier processus qui aura un ID=1 (init
ou systemd
en fonction du type et de l'âge de la distribution). Tous les autres processus seront des fils et petits-fils de ce processus.
Vous avez plusieurs méthodes pour afficher l'arborescence des processus, c'est-à-dire quel processus est le père de quel autre processus.
Voyons maintenant comment :
afficher la hiérarchie des processus en utilisant les options de la commande
ps
ou encore en utilisant une nouvelle commande qui est bien pratique pour ça :
pstree
!
Utilisez les gestionnaires de tâches sous Linux en mode terminal
Plutôt que de vous expliquer cette commande, qui a l’avantage d’être très graphique (dans le cadre du terminal quand même hein…), je vous propose de la lancer tout simplement et d’analyser ensemble ce qu’elle affiche.
Mais juste avant, je voulais aussi vous parler de la commande htop
. C’est la petite cousine de top
, mais elle n’est pas forcément installée par défaut sur toutes les distributions.
L'objectif de cette commande est aussi d'afficher un gestionnaire de tâches courantes, mais de manière un peu plus graphique et ergonomique encore.
Les fonctions de tri et de filtre sont plus facilement accessibles via les touches F1 à F10, et il est possible de personnaliser l'affichage avec F2.
htop
vous propose par défaut une vue de la charge des CPUs de manière individualisée, ce qu'il est possible de faire également avec top
en pressant la touche 1.
Allez, assez de blabla, on y va ! Et au passage je vous présente le concept de "load average", qui permet d’établir une tendance à l’instant T de la charge du serveur :
Modifiez la priorité d’un processus
Si vous reprenez les exemples d'affichage précédents des commandes top
ou htop
, il est un champ que nous n'avons pas évoqué : il s'agit deNI
(pour NICE).
En effet, le noyau gère l'allocation du temps CPU pour chaque processus en fonction d'un facteur de priorité.
Le champ NI
correspond à l'affichage de la valeur numérique de ce facteur de priorité et sous Linux :
L'intervalle numérique de priorité va de -20 à 20,
Plus la valeur de la priorité est élevée, moins le processus est prioritaire. Un moyen mnémonique très simple de se souvenir de ce fait est de traduire NICE par gentil en français, et de considérer que plus un processus est gentil, plus il laisse les autres occuper du temps CPU avant lui,
Un processus plus prioritaire occupera plus de temps CPU et de ressources du système qu'un processus moins prioritaire.
Sans indication contraire, les processus se lancent naturellement avec une priorité intermédiaire valant 0.
Tous les utilisateurs peuvent modifier uniquement à la baisse (c'est-à-dire en augmentant la valeur) la priorité de leur processus. Seul root
peut modifier à la hausse la priorité d'un processus (c'est-à-dire en diminuant la valeur).
Dans la plupart des cas, vous aurez besoin de modifier la priorité d'un processus qui est déjà lancé :
soit pour l'augmenter afin de terminer ses tâches plus rapidement,
soit pour la diminuer car il bloque l'exécution normale de ses petits copains sur le système.
Allez, je vous montre tout ça en vidéo, et notamment comment utiliser les commandes ps
,renice
et top
:
Déclenchez manuellement la terminaison d’un processus
Dans certains cas, il vous faudra terminer un processus qui ne remplit plus ses tâches pour x raisons :
bug,
boucle infinie,
surcharge mémoire ou cpu,
etc.
Le noyau Linux peut envoyer des signaux à ces processus
Un processus peut envoyer un signal à un autre processus
Et un processus peut même s’envoyer à lui-même un signal
Sous Linux, il existe 30 signaux principaux normalisés, numérotés de 1 à 30. Ainsi lorsqu'un processus reçoit un signal, en fonction de sa nature, il peut l’"écouter" et appliquer son message ou bien l’ignorer.
Il faut bien comprendre que l'interprétation d'un signal est de la responsabilité du processus qui le reçoit. Ce dernier peut tout à fait être codé en ignorant un ou plusieurs signaux (sauf 1 signal particulier), mais c'est très rarement le cas.
Il n'est pas nécessaire de connaître tous ces signaux, seuls ceux permettant d'interrompre le fonctionnement d'un processus nous intéressent ici. Ils sont au nombre de 3 :
SIGINT (signal numéro 2)
SIGTERM (signal numéro 15)
SIGKILL (signal numéro 9)
SIGINT et SIGTERM
Ces deux signaux indiquent au processus sa terminaison de façon propre. Autrement dit : il y a ici une volonté à ce que ce soit le processus lui-même qui se termine, en libérant correctement toutes les ressources qu'il occupe à cet instant.
SIGINT est assez connu, puisque généralement il correspond à l'interruption clavier CTRL+c.
Notez que ces deux signaux peuvent être ignorés par le processus cible (je pense notamment au processus parent de tous les autres, init
ou systemd
ou encore à tous les processus gérés directement par le noyau Linux) .
SIGKILL
C’est le signal destructeur par définition. Souvent, il est envoyé lorsque les deux précédents n'ont pas fonctionné. Le processus ciblé est terminé brutalement :
pas forcément aussi proprement qu'avec SIGINT ou SIGTERM,
et les ressources associées ne sont pas libérées proprement.
Les processus ne peuvent pas ignorer ce signal. Tout simplement parce qu'il ne leur est pas adressé directement. SIGKILL est envoyé au processus principal de Linux (init
ou systemd
) qui se charge, lui, de tuer le processus cible.
Quoi ? Dit comme ça, c’est pas très clair…
Pas d’inquiétude : je vous montre tout ça en vidéo. Et au passage, nous verrons la commande kill
qui permet d’envoyer un signal à un processus. (Oui, le nom de cette commande est un peu orienté sur les 3 signaux décrits ci-dessus justement, mais elle peut envoyer des signaux plus gentils que les tueurs… 🤣).
En résumé
Les commandes
ps
ettop
permettent de visualiser l'activité du systèmeLes processus sont hiérarchisés et le parent d'origine est
init
(SystemV) ousystemd
La commande
nice
permet de modifier la priorité d'exécution d'un processusLa commande
kill
permet d'envoyer un signal à un processus
Dans le dernier chapitre de cette partie, je vous propose désormais d'effectuer un petit audit de l'activité réseau en vérifiant notamment les services ouverts et leurs ports, en analysant en temps réel le trafic sur les interfaces et en effectuant une capture des trames réseau entrantes et sortantes. Vous m'accompagnez ?