Gestion des processus

Sommaire

Index

Introduction

UNIX/Linux permettent de gérer des processus de manière parallèle: pendant qu’un logiciel est exécuté, un autre peut également l’être. Ceci donne l’illusion que les deux programmes fonctionnent en parallèle.

Nous présentons ici quelques fonctionnalités du shell. Même si vous n’utilisez pas toutes les fonctionnalités, il est utile de les connaître, dans le cas où vous en auriez besoin.

Processus

Présentation

Analogie “mécanique”

Garage

Prenons un garage spécialisé dans le changement de pneumatiques.

Dans ce garage, un programme est très souvent exécuté:

Un opérateur exécute ce programme quand un véhicule se présente:

Si un autre véhicule doit avoir ses roues changées, l’opérateur va mettre de côté l’exécution du processus de changement de roue sur le premier.

Puis revenir sur le premier véhicule pour terminer le premier processus:

Processus et programme

Le programme de changement de pneus est la suite d’opérations à effectuer.

Le processus intègre :

Programme

Suite d’opérations à effectuer

Conventions

Dans ce document, quand vous rencontrez :

$ sleep 5
<wait 5 seconds>
$

Quand vous voyez <Ctrl-C>, cela signifie que vous devez enfoncer la touche Ctrl et la touche C en même temps (pour cela, enfoncer d’abord la touche Ctrl puis presser brièvement et relâcher la touche C, et relâcher la touche Ctrl).

Gestion des processus

Exécution

Quand vous lancez :

sleep 5

le processus se met en pause pendant 5 secondes.

Terminaison

Vous exécutez cette commande en foreground. Ce qui signifie que le shell attend la fin de la commande avant de vous “rendre la main”. Maintenant exécutez :

$ sleep 6000
<Ctrl-C>
$

Quand vous pressez la séquence de touche, vous envoyez un signal de terminaison au processus actuel (celui qui s’exécute en avant plan), ce qui fait que vous n’avez pas à attendre 6000 secondes avant de pouvoir exécuter une nouvelle commande.

Exécution en arrière-plan

Plutôt que de lancer une commande en foreground (avant-plan), on peut la lancer en background (arrière-plan).

Ceci se fait simplement en rajoutant un & après la commande.

$ sleep 6000 &
[3] 27181
$

En exécutant cette commande en arrière plan, le prompt “revient” immédiatement. De plus Unix, vous indique que le job que vous venez de lancer est le numéro 3, et que son numéro de processus est le 27181 (dans cet exemple).

Le shell garde une trace de tous les jobs en cours d’exécution. La commande jobs permet de les afficher

> jobs
[2] - running evince TDUnixJobs.pdf
[3] + running sleep 6000

Affichage des processus

Affichage basique

L’affichage des informations sur les processus se fait par la commande ps:

$ ps
   PID TTY          TIME CMD
  3342 pts/2    00:00:00 bash
  3361 pts/2    00:00:00 sleep
  3362 pts/2    00:00:00 ps
$

Affichage avancé et filtré de tous les processus du système

On peut ajouter des options à la commande ps et la filtrer avec la commande grep:

$ ps -elf | grep sleep
0 S laurent    3089   2525  0  80   0 -  1803 restar 10:15 pts/0    00:00:00 sleep 6000
0 S laurent    3361   3342  0  80   0 -  1803 restar 11:20 pts/2    00:00:00 sleep 6000
0 S laurent    3365   3342  0  80   0 -  2945 pipe_w 11:25 pts/2    00:00:00 grep --color=auto sleep
$

Et même rajouter l’entête des colonnes:

$ ps -elf | head -1 ; ps -elf | grep sleep
F S UID         PID   PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
0 S laurent    3089   2525  0  80   0 -  1803 restar 10:15 pts/0    00:00:00 sleep 6000
0 S laurent    3361   3342  0  80   0 -  1803 restar 11:20 pts/2    00:00:00 sleep 6000
0 S laurent    3365   3342  0  80   0 -  2945 pipe_w 11:25 pts/2    00:00:00 grep --color=auto sleep
$

Variante: ps aux

On peut aussi voir ce processus en faisant :

$ ps aux | grep sleep
laurent 27181 0.0 0.0 7308  704 pts/4 SN 15:26 0:00 sleep 6000
laurent 27430 0.0 0.0 14272 964 pts/4 S+ 15:33 0:00 grep sleep
$

Tuer un processus

Comment faire pour terminer ce job ? Il y a plusieurs façons :

$ kill 27181   # En utilisant son pid
$ kill %3      # En utilisant son numéro job
$ fg           # puis <Ctrl-C>

fg ramène le processus à l’avant-plan, il peut être interrompu avec la combinaison CtrlC

Vous pouvez aussi mettre en background une commande que vous venez de lancer, en exécutant

$ sleep 6000
<Ctrl-Z>
ˆZ
[1] + 28640 suspended sleep 6000


$ bg
[1] 28640 continued sleep 6000

Tuer un processus récalcitrant

Parfois un processus peut refuser de se terminer:

Si nécessaire, il est possible de forcer l’arrêt du processus. Mais cela peut l’empêcher de se terminer correctement et peut parfois générer des erreurs (système de fichiers).

Pour forcer un arrêt, on ajoute l’option -9:

kill -9 27181

Applications pratiques

Programmes en ligne de commande

Vous pouvez lancer le téléchargement de différentes pages de ce guide.

Par exemple :

wget --limit-rate=1 http://tstn1.aezi.fr/ecole-23-24/processus.html

Pour reprendre un téléchargement tué, utiliser l’option --continue

wget --continue --limit-rate=1 http://tstn1.aezi.fr/ecole-23-24/processus.html

Lancera le téléchargement de la page processus.html dans le répertoire courant.

Observer ce qui se passe avec la commande ps

Observer ce qui se passe lorsque le processus est stoppé ou en cours d’exécution (raccourci CtrlZ et commandes fg et bg).

Utiliser la commande tail -f processus.html pour observer l’état du fichier téléchargé.

En utilisant --limit-rate=1 télécharger en parallèle les fichiers:

Observer l’évolution de chaque téléchargement avec la commande tail -f

Programmes en mode graphique

Installer le paquet x11-apps et lancer par exemple les commandes suivantes:

Gestion des tâches du système

Utiliser la commande top

GNU-Screen

Présentation

Le programme screen permet d’exécuter des processus dans des terminaux virtuels.

Il permet notamment d’exécuter un processus, de fermer un terminal, puis de retrouver le processus plus tard.

Installation

CentOS

sudo dnf install epel-release -y
sudo dnf install screen

Debian

sudo apt install screen

Utilisation

Lancement de screen

Exécuter la commande screen

screen

Lancement d’un téléchargement “lent

wget --limit-rate=8 http://tstn1.aezi.fr/ecole-23-24

Détachement du pseudo-terminal

Taper successivement les combinaisons de touches suivantes:

Ctrla puis d

Vous êtes maintenant détaché du processus screen

Afficher la liste des screen en cours d’exécution

screen -ls

Cette commande affiche une sortie du type:

There are screens on:
    80330.pts-0.centos  (Detached)
    50522.pts-3.centos  (Detached)
2 Sockets in /run/screen/S-supv.

Rattacher une session existante

Par exemple, pour rattacher la session screen 80330.pts-0.centos commencer à taper:

screen -r 80

Puis appuyer sur la touche (Tabulation)

La ligne se complète automatiquement.

Appuyer sur la touche (Entrée)

Rattachement à une session déjà attachée

Si une de mes sessions est déjà attachée:

$ screen -ls
There are screens on:
    80330.pts-0.centos  (Attached)
    50522.pts-3.centos  (Detached)
2 Sockets in /run/screen/S-supv.

Je peux m’y connecter en la détachant au préalable.

Pour cela, j’utilise l’option -d :

screen -d -r 80330.pts-0.centos

Faire défiler la sortie d’une commande

Dans screen appuyer sur Ctrla puis appuyer sur la touche [

Sous Windows: [ s’obtient avec la combinaison AltGr5

Sous Mac: [ s’obtient avec la combinaison Alt5

Ensuite, utiliser Ctrld et Ctrlu pour faire défiler l’écran respectivement vers le bas (down) et vers le haut (up)

Appuyer sur q pour quitter le mode défilement

Essayer par exemple d’appeler la commande ls -R /

Mode commande

Dans une session screen taper la séquence de touches Ctrla, :

En mode commande, il est possible d’exécuter différentes commandes spécifiques:

Raccourci Ctrla

Le raccourci Ctrla est utilisé dans un terminal standard pour revenir au début de la ligne.

Il ne fonctionne plus directement dans screen.

Pour le faire fonctionner, utiliser la séquence suivante:

Quitter une session screen

Ctrld ou exit

Alternative à screen

tmux offre une alternative à la commande screen

Le raccourci principal pour utiliser les fonctions de tmux est CtrlB (au lieu de CtrlA dans screen).

Raccourcis et commandes tmux

Créer un nouvelle session

tmux

Se détacher de la session courante

Depuis une session tmux :

CtrlB puis D.

Lister les sessions

Depuis un terminal:

tmux ls

Se réattacher à une session

Depuis un terminal:

tmux attach
# OU
tmux a

Ou si la session est nommée:

tmux attach -s nom_de_la_session

Créer une nouvelle session nommée

Depuis un terminal:

tmux -s new nom_de_la_session

Créer une nouvelle fenêtre

Depuis une session tmux :

CtrlB puis C.

Lister les fenêtres

Depuis une session tmux :

CtrlB puis W.

Renommer la fenêtre courante

Depuis une session tmux :

CtrlB puis ,.

Aller dans la fenêtre précédente

Depuis une session tmux :

CtrlB puis P.

Aller dans la fenêtre suivante

Depuis une session tmux :

CtrlB puis N.

Tuer la fenêtre courante

Depuis une session tmux :

CtrlB puis &.

Sélectionner une autre fenêtre

Chaque fenêtre est numérotée de 0 à N (ou N est égal au nombre de sessions - 1)

Depuis une session tmux :

Diviser la fenêtre en deux panneaux horizontaux

Depuis une session tmux :

CtrlB puis

Afficher les numéros des terminaux

CtrlB puis Q

Diviser la fenêtre en deux panneaux verticaux

Depuis une session tmux :

CtrlB puis %

Basculer sur le panneau actif précédemment

Depuis une session tmux :

CtrlB puis ;

Changer de panneau

Depuis une session tmux :

CtrlB puis O

Ou

Tuer un panneau

Depuis une session tmux :

CtrlB puis X

Déplacez le terminal vers le panneau précédent

CtrlB puis {

Déplacez le terminal vers le panneau suivant

CtrlB puis }

Tuer une session

Depuis un terminal:

tmux kill-session nom_de_la_session

Autres commandes

Pour connaître les autres commandes utilisables, voir les pages suivantes: