Vous êtes sur la page 1sur 48

Gestion

des processus sous Linux


Gestion
des processus sous Linux

Concepts généraux
Différents concepts liés aux processus

Type :
• Processus système • Processus lourd
(y compris les démons) • Processus léger
• Processus utilisateur
• Processus mono-thread
• Processus multi-threadé
• Processus cyclique
• Processus réactif • Processus séquentiel
• Processus temps réel • Processus parallèle
Différents concepts liés aux processus

Modalité d’exécution
Relations inter-processus : (processus utilisateur) :
• Concurrence sur • en avant plan
l’acquisition de ressources • en arrière plan
• Coopération pour réaliser
un but commun • En tant que tâche planifiée
• Communication de • en mode différé
messages
• en mode synchrone
• en mode asynchrone
Différents concepts liés aux processus

PCB (Process Control Bloc) : Etat :


• PID • Actif (càd en exécution
• Etat physique)
• Contexte matériel • Eligible (càd prêt à être
(description des registres du exécuter)
processeur , description de la • En attente (d’un événement
RAM allouée, …) donné)
• Contexte logiciel (liste des • Bloqué (sur la réalisation
fichiers ouverts, liste des d’un service système)
événements attendus, …) • Processus terminé
• Autres (PPID, UID, eUID, …, • Processus préempté
priorité, …, liens de chaînage, • Processus swapé
…)
Au lancement du système
Aperçu de la liste des processus
Espace noyau
Espace utilisateur
Le processus init

Le processus init se charge en premier lieu de créer les autres


processus nécessaires au fonctionnement du système,
notamment les processus daemons (inetd, crond, …) et les
processus getty.

Les processus getty vont permettre aux terminaux branchés au


système d'établir une connexion et de lancer le shell de base
servant à la lecture et l’interprétation des commandes de
l'utilisateur.

Les commandes provenant de ces terminaux créent d'autres


processus qui se greffent à l’arborescence unique des processus.
Systemd : une alternative au processus init

Une alternative au démon init (issu


de Unix System V) est systemd.

Ce système d’initialisation est


spécifiquement conçu pour le
noyau Linux ; il est installé par
défaut avec diverses distributions
(Arch Linux, Centos 7, Debian 8, ...)
et à partir d’Ubuntu 15.04.

Il a pour but d’offrir un meilleur


cadre pour la gestion des
dépendances entre services, de
permettre le chargement en
parallèle des services au
démarrage, et de réduire les appels
aux scripts shell.
Les runlevels du processus de PID=1

On peut exécuter le système avec un


runlevel donné.

Sous Linux, certains niveaux


correspondent à une utilisation
particulière :
0 : c’est pour demander l’arrêt du
système
1 : c’est le mode maintenance
(mono-utilisateur)
2,3,4,5 : ce sont les niveaux
d’init multi-utilisateurs
6 : c’est le niveau de redémarrage
du système
.
Affichage et modification du runlevel

Pour savoir quel est le runlevel courant, il faut utiliser la commande :


# runlevel
N 2

Pour changer le runlevel courant pendant l'exécution, il faut utiliser


seulement les niveaux 1 à 5 et recourir à la commande :
# telinit 3

La commande init peut être également invoquée avec le numéro du


niveau d’exécution désiré. Par exemple, pour stopper le système ou de
le rebooter, on peut saisir :
# init 0
# init 6

Ces deux commandes correspondent également à leur équivalent :


# shutdown
# reboot
Séquence type de démarrage
d’une session de travail sous bash
L’arborescence du processus de PID = 1

Le processus init (ou


systemd) de PID=1 est
l'ancêtre de tous les
autres processus créés
dans l’espace utilisateur.

L’ensemble des
processus présents sous
init forment une
arborescence (avec des
processus père, et des
processus fils).
Gestion
des processus sous Linux

Commandes linux
L’interpréteur de commandes

Le shell (et en l’occurrence bash) est un interpréteur de commandes qui


tourne dans un terminal en mode texte.

Il est censé réaliser le code correspondant à cet algorithme.


Lancer une commande sous bash

A la demande de l’exécution en avant-plan d’une commande (telle


que ls dans cet exemple), un processus fils est créé et on lui donne la
main pour exécuter sa tâche. Entre temps le processus père, ici le
bash courant, passe à l’état endormi et il ne reprend la main pour
afficher de nouveau le prompt système que lorsque son processus fils
se termine.
Obtenir des informations par ps
Obtenir des informations par top

$top
Obtenir des informations par pstree

$pstree -p
Informations connues sur les processus

Chaque processus en exécution possède un PCB dans lequel


sont sauvegardées diverses informations utiles :
- statiques comme : PID, PPID, UID, TTY, CMD,…
- dynamiques comme : STAT, PRIO, NI, TIME,…
Etats d’un processus sous Linux
Envoyer des signaux à un processus

Liste des signaux Linux :


Envoyer des signaux à un processus

Commandes d’envoi d’un signal :

$kill -15 785

$killall -9 chrome

Le signal 9 correspond à SIGKILL. Il est censé tuer un processus en


exécution.

Remarque :
Quoi qu'il arrive, on ne peut tuer que nos propres processus (sauf
si on est root). Par conséquent, pas d’inquiétude pour les
processus des autres utilisateurs connectés portant le même
nom que le processus qu’on désire tuer car ils ne seront pas
affectés
Mort d’un processus

Mort naturelle ou pas ou sur demande de l’utilisateur


Un processus peut se terminer normalement ou anormalement.
• Dans le premier cas, l'application est abandonnée à la demande
de l'utilisateur, ou parce que la tâche à accomplir est finie.
• Dans le second cas, un dysfonctionnement sérieux est
découvert et qui ne permet pas au programme de continuer son
travail.
• Dans le troisième cas, sur demande de l’utilisateur (ou un
processus ayant les permissions qu’il faut)

Code de retour à la terminaison


• Un programme peut se finir de plusieurs manières. C’est à cet
instant qu’on renvoie à travers la fonction système exit( ) un
compte rendu d'exécution sous forme de valeur entière.
• Cette valeur du code de retour est lue par le processus père, qui
peut en tirer les conséquences adéquates.
Orphelins et Zombies

● Processus orphelins
– Si un processus père meurt avant son fils ce dernier
devient orphelin.
– Le noyau s'arrange dans ce cas pour ≪ faire adopter ≫
cet orphelin par le processus init

● Processus zombie
– Si un fils se termine tout en disposant toujours d'un PID
celui-ci devient un processus zombie
– Le cas le plus fréquent : le processus s’est termine mais
son père n’a pas (encore) lu son code retour.
Contrôler la priorité des processus

Priorité = entier variant entre -20 et 20


La priorité maximale pour un processus est -20.
Si elle n'est pas définie, tous les processus s'exécutent avec une priorité
de 0 par défaut (la priorité de planification de « base »).

Les processus ayant la priorité maximale utilisent plus de ressources


système que les autres. Les processus ayant une priorité inférieure
s'exécuteront lorsque le système sera libéré par les tâches de priorité
plus élevée.

Commandes pour modifier la priorité d’un processus (PID=785)

# renice +15 785

Lancement d’un processus avec une valeur de priorité :

$nice -n 19 dd if=/dev/cdrom of=~/mdk1.iso


Processus en arrière plan

Demande d’exécution d’un processus en arrière plan

$sleep 5555 &

Lancement en mode continuation de l’exécution après fermeture de la


console

$nohup cp video.avi copie_video.avi

Liste des processus exécutée en background

$jobs
Suspendre l’exécution d’un processus

Au lieu de chercher quel signal il faut envoyer via la commande


kill pour suspendre l’exécution d’un processus, on peut tout
simplement taper Ctrl+Z.

On lance le processus en avant plan, puis on décide de le passer de


l’état en exécution à l’état stoppé :

$./exemple_fg_bg
Ctrl+Z
[1]+ Stopped exemple_fg_bg
Basculer un processus d’un état vers un autre

Pour ramener un job en avant-plan :


$./exemple_fg_bg &
[1] 1756
$ fg %1
exemple_fg_bg

Pour continuer l'exécution d’un job


tournant en arrière-plan, on sélectionne
son numéro tel qu’indiqué par jobs et on
l’indique à la commande fg :
$ jobs
[1]+ Stopped exemple_fg_bg
$ bg %1
[1]+ exemple_fg_bg &
Autres commandes utiles

La commande time permet de connaître la durée d’exécution d’une


tâche. Celle-ci utilise le temps d’horloge du système, elle dépend
donc de la puissance du processeur et de sa sollicitation.
$ time ls

La commande pidof permet de trouver les PID des processus


explicités par leur nom
$ pidof sleep

La commande pkill permet d’envoyer un signal à des processus


en fonction de leur nom
$ pkill sleep

La commande pgrep permet de rechercher des processus en


fonction de leur nom et d'autres propriétés
$ pgrep -u root named
Gestion
des processus sous Linux

Le système de fichier procfs


procfs en deux mots

procfs (PROcess File System) est un pseudo-système de fichiers


monté sur /proc.

$ mount | grep "type proc"


proc on /proc type proc (rw, noexec, nosuid, nodev)

Le répertoire /proc contient une arborescence de fichiers spéciaux


paradoxalement presque tous de taille = 0

$ ls –ld /proc
dr-xr-xr-x 109 root root 0 Jan 19 15:00 proc

$ ls –l /proc
total 0
dr-xr-xr-x 8 root root 0 Jan 19 15:00 1
dr-xr-xr-x 8 daemon root 0 Jan 19 15:00 129
[...]
Le répertoire /proc

/proc est un pseudo-système de fichiers.

Le répertoire /proc contient une hiérarchie de fichiers spéciaux qui


décrivent le matériel et l'état actuel du noyau mais également les
processus en exécution
• ceci va permettre aux applications et aux utilisateurs d'obtenir des
informations sue le système.
• certains de ces fichiers peuvent être manipulés pour transmettre à
chaud des changements de configuration au noyau.

Raison d’être de /proc :


• Consultation de l‘état du système
(éventuellement moyennant des commandes appropriées :
hostname, lscpu, lsusb, lsmod, lsdev, ps, top, free,
iostat, vmstat, df, …)
• Paramètrage du système en live
(pour changer le nom de la machine, autoriser/refuser le routage,
empécher l’IP Spoofing, …)
Raisons d’être de /proc

• Consultation de l‘état de son système


(éventuellement moyennant des commandes appropriées :
hostname, lscpu, lsusb, lsmod, lsdev,
ps, top, free, iostat, vmstat, df, …)

• Paramètrage du système en live


(il faut être super-utilisateur pour pouvoir :
augmenter le nombre maximum de fichiers ouverts, changer le
nom de la machine, autoriser/refuser le routage, empêcher l’IP
Spoofing, …)
Les données sur le matériel

Le répertoire /proc contient de nombreux fichiers virtuels tels que


/proc/cpuinfo, /proc/interrupts, /proc/meminfo et /proc/partitions
qui fournissent un aperçu sur le matériel disponible (processeur,
mémoire, périphériques, …).
Les données sur le système

Différentes informations sur le


système sont accessibles sous
/proc.

Le fichier /proc/filesystems et
le répertoire /proc/sys/ par
exemple fournissent des
informations sur la configuration
du système et sur les interfaces.
Les données sur les processus

Sous Linux, les détails sur chacun


des processus en exécution sont
stockés dans les sous répertoires
de /proc/<PID>.

On peut ainsi explorer pour un


processus donné le contenu de l’un
de ces fichiers:
• cmdline contient la ligne de
commande qui a créé le
processus.
• status contient des informations
sur l’état du processus (en
attente, en exécution, … ).
• exe est un lien vers le fichier
exécutable utilisé par le
processus.
• etc
Gestion
des processus sous Linux

Exercices & corrigés


Exercices

1. Qu’est-ce qu’un programme ou une application active ?


2. Quelle commande vous permet de vérifier facilement quel utilisateur
consomme la plus grande partie des ressources processeur du
système ?
3. Dans l’espace utilisateur, est-ce que tous les processus ont un
processus parent ?
4. Qu’arrive-t-il si un processus enfant perd son parent ? Comment le
savoir ?
5. Quelle commande permet d’envoyer un signal à un processus ?
6. De quel élément avez-vous besoin pour envoyer un signal à un
processus ?
Exercices

7. Quel signal reçoivent tous les processus lorsque la session bash à


partir de laquelle ils ont été lancés se termine ?

8. Un utilisateur a exécuté la ligne de commande suivante :


$sleep 1111 & sleep 2222& sleep 3333&
Comment peut-on détruire le processus de la seconde commande :
A. En supposant qu'aucun processus en arrière-plan n'existait avant,
taper la commande kill %2
B. En tapant ps -f, puis en notant le PID de sleep 2222 (colonne
CMD), et enfin, en tapant la commande kill avec comme
argument le PID noté
C. En tapant kill $(ps –f |grep 'sleep 2222'|cut -b10-15)
D. En tapant jobs, puis en notant le numéro du job (entre crochets)
de sleep 2222, et enfin, en tapant la commande kill avec
comme argument le numéro du job précédé du caractère « % »
Corrigé des exercices

1. Quel est le nom d’un programme ou d’une application active ?


• Réponse : processus (en avant plan ou en arrière plan)
2. Comment vérifier les processus qui consomment la plus grande
partie des ressources processeur du système ?
• Réponse :
• Liste des 5 processus consommant le plus de mémoire
ps -eo pmem,pcpu,pid,args | sort -rnk 1 | head -5

• Liste des processus consommant le plus de cpu


ps -eo pmem,pcpu,pid,args | tail -n +2 | sort -rnk 2 | head
Corrigé des exercices
3. Dans l’espace utilisateur, est-ce que tous les processus ont un
processus parent ?
• Réponse : oui sauf le processus de PID =1 (init)
4. Qu’arrive-t-il si un processus enfant perd son parent ? Comment
le savoir ?
• Réponse :
• le processus devient orphelin
• Pour le savoir il faut le trouver avec ps –l qui affiche comme
PPID = 1
5. Quelle commande permet d’envoyer un signal à un processus ?
• Réponse : en principe on recourt à kill, mais on peut également
utiliser killall ou bien encore pkill
Corrigé des exercices
6. De quel élément avez-vous besoin pour envoyer un signal à un
processus ?
• Réponse 1 : on a besoin pour exécuter la commande kill de
savoir :
• Quel est le PID du processus (par exemple pour bash)
$ pidof bash
• Quel est le signal à envoyer par exemple le SIGQUIT=3
La liste des signaux est obtenue par la commande
$ kill –l v

La commande s’écrit alors :


v
$ kill -3 `pidof bash`
Corrigé des exercices
6. ( Suite ) De quel élément avez-vous besoin pour envoyer un
signal à un processus ?
• Réponse 2 : on peut utiliser la commande pkill ou killall.
Dans ce cas la seule chose à savoir est le numéro du signal à
envoyer, car le nom du processus signalé est connu.
Pour l’exemple de sleep 555 & et SIGTERM=15 la commande
prend l’une des deux formes :
$ killall –SIGTERM bash
$ pkill -15 bash

7. Quel signal reçoivent tous les processus lorsque la session bash


à partir de laquelle ils ont été lancés se termine ?
• Réponse : SIGTERM
Corrigé des exercices
8. Un utilisateur a exécuté la ligne de commande suivante :
$sleep 1111 & sleep 2222& sleep 3333&
Comment peut-on détruire le processus de la 2ème commande ?
A. En supposant qu'aucun processus en arrière-plan n'existait
avant, taper la commande kill %2
B. En tapant ps -f, puis en notant le PID de sleep 2222
(colonne CMD), et enfin, en tapant la commande kill avec
comme argument le PID noté
C. En tapant kill $(ps –f |grep 'sleep 2222'|cut -b10-15)
D. En tapant jobs, puis en notant le numéro du job (entre
crochets) de sleep 2222, et enfin, en tapant la commande
kill avec comme argument le numéro du job précédé du
caractère « % »

Réponse : A, B, D
C peut fonctionner cela dépendra du résultat de grep
Gestion
des processus sous Linux

Vous aimerez peut-être aussi