Cette fiche reprend les notions vues lors du CTP n°5. Vous retrouverez synthétisées sur cette page les différentes commandes utilisées, leur intérêt et comment nous avons pu les utiliser lors des manipulations sur ordinateur.
La fiche couvre les notions des exercices indiqués comme étant obligatoires (exercices 1, 2, 3 et 4), c’est-à-dire au programme de l’examen final.
Table des matières
<aside> <img src="/icons/comment_blue.svg" alt="/icons/comment_blue.svg" width="40px" /> Processus et tâches
Un processus est une unité de travail sur un système d'exploitation. Il peut s'agir d'un programme, d'un script, ou d'un service. Chaque programme que vous exécutez représente un ou plusieurs processus. Chaque processus est identifié par un numéro unique appelé PID (Process IDentifier).
Linux nous offre plusieurs commandes pour visualiser les processus en cours d'exécution que nous allons détailler par la suite.
Une tâche, par contre, est une unité de travail du Shell. Une tâche peut être un processus, ou un groupe de processus mais il faut qu'il ait été lancé par le Shell. Le Shell a un système de contrôle de tâches : c'est la capacité à exécuter plusieurs commandes en même temps. On peut lancer une commande en arrière-plan et en avant-plan.
La commande jobs permet d'afficher les tâches en cours d'exécution.
<aside> <img src="/icons/arrow-right_yellow.svg" alt="/icons/arrow-right_yellow.svg" width="40px" /> En somme
Une tâche est un processus, mais un processus n'est pas forcément une tâche.
</aside>
</aside>
<aside>
<img src="/icons/comment_blue.svg" alt="/icons/comment_blue.svg" width="40px" /> Commande ps
ps permet d'afficher les processus en cours d'exécution. Par défaut, ps n'affiche que les processus lancés par l'utilisateur courant.
On peut coupler cette commande avec plusieurs options :
Option -f : Affiche la liste complète du format (affiche des informations supplémentaires sur les processus d’exécution)
Option -u : Affiche des informations sur les processus en cours d'exécution pour l'utilisateur actuel
<aside> <img src="/icons/thought_lightgray.svg" alt="/icons/thought_lightgray.svg" width="40px" /> Remarque
On peut également ajouter en argument le nom de l’utilisateur dont on souhaite afficher les processus en cours d’exécution associés. Par exemple, la commande
$ ps -u root # ou bien `ps -U root`
affiche tous les processus en cours d'exécution associés à l'utilisateur root.
</aside>
Option -T : Affiche une liste de threads (unité d’exécution plus fine que les processus) associés aux processus en cours d'exécution. Chaque thread est répertorié avec son propre PID.
Option -e : Affiche tous les processus en cours d'exécution sur le système, qu'ils soient associés à l'utilisateur actuel ou non
La liste des processus affichée contient quatre colonnes par défaut :
pts/1 (pseudo-terminal slave) signifie que le processus a été lancé dans un pseudo-terminal. Le chiffre renseigné correspond au numéro du terminal (par exemple si vous avez plusieurs instances du terminal ouverts).<aside> <img src="/icons/compose_green.svg" alt="/icons/compose_green.svg" width="40px" /> Application : Processus et redirection
Mêlons les commandes de redirection vues à la fiche précédente avec la commande ps. Après chaque commande on affiche le résultat.
Affichez le nombre de processus lancés par l'utilisateur courant.
$ ps -ef | grep -c debian # 'debian' est mon nom d'utilisateur, l'option `-c` de grep permet de compter
3
Affichez le nombre de processus lancés par l'utilisateur root.
$ ps -ef | grep -c root # On trie depuis l'affichage en long format '-ef' les lignes contenant 'root'
122
Affichez les nombre de processus lancés par l'utilisateur courant et dont la commande est bash.
$ ps -u | grep "bash" | wc -l
2
</aside>
</aside>
<aside>
<img src="/icons/checkmark_blue.svg" alt="/icons/checkmark_blue.svg" width="40px" /> Commande top (Optionnel)
top permet d'afficher les processus en cours d'exécution. Il peut s'utiliser de manière interactive notamment les trier par utilisation du CPU. On peut quitter avec la touche q.
Une fois lancée, elle s'exécute en continu et affiche les processus en temps réel. La touche h permet d'afficher l'aide et de visualiser les fonctionnalités disponible.

Interface d’aide
<aside> <img src="/icons/compose_green.svg" alt="/icons/compose_green.svg" width="40px" /> Exemple
Pour filtrer les processus en cours d'exécution pour n'afficher que ceux lancés par l'utilisateur root, on commence par entrer :
$ top
On arrive sur la page d’affichage dynamique des processus. Conformément à la page d’aide, on appuie ensuite sur la touche U puis on est invité en entrer le nom de l’utilisateur recherché. On écrit donc root puis on obtient la page triée suivante :

</aside>
</aside>
<aside> <img src="/icons/comment_blue.svg" alt="/icons/comment_blue.svg" width="40px" /> Gestion des tâches
Chaque tâche est associée à un numéro (PID), c’est ce qui permet de l’identifier dans les commandes que l’on va suivre. Pour afficher les PID des processus en cours, on utilise l’option -p de jobs.
Tout d’abord, on peut mettre en pause ou arrêter définitivement un processus en cours. Pour cela, on utilise les raccourcis clavier :
Ctrl-Z pour mettre en pause un processusCtrl-C pour arrêter proprement un processusPar défaut, un processus s’exécute en avant-plan : l’utilisateur attend que ce dernier se termine avant de pouvoir entrer une nouvelle commande, les commandes sont exécutées séquentiellement. Mais il est possible d’exécuter plusieurs processus simultanément, en le passant en arrière-plan : il sera donc possible de saisir une nouvelle commande pendant l’exécution d’une autre.
Pour lancer un processus en arrière-plan, on a plusieurs possibilités :
Si l’on souhaite lancer une commande directement en arrière-plan, on utilise le symbole & que l’on place en fin de ligne.
<aside> <img src="/icons/compose_green.svg" alt="/icons/compose_green.svg" width="40px" /> Exemple
Lançons directement la commande sleep (durant 100 secondes ici) en arrière-plan.
$ sleep 100 &
[1] 1579
$ jobs
[1]+ Running sleep 100 &
</aside>
Si on lance un processus en avant-plan, puis que l’on le met en pause, alors il est possible de le relancer en arrière-plan avec la commande suivante :
$ bg %<numéro de tâche> # Numéro entre crochets après `jobs`
<aside> <img src="/icons/compose_green.svg" alt="/icons/compose_green.svg" width="40px" /> Exemple
On lance la commande sleep en avant-plan puis on la met en pause :
$ sleep 100
^Z
[1]+ Stopped sleep 100
Lançons ce processus, dont l’identifiant est 1, en arrière-plan
$ bg %1
[1]+ sleep 100 &
$ jobs
[1]+ Running sleep 100 &
</aside>
Il est également possible de faire l’inverse ! Pour passer un processus de l’arrière-plan à l’avant-plan, on utilise la commande suivante :
$ fg %<numéro de tâche> # Numéro entre crochets après `jobs`
<aside> <img src="/icons/compose_green.svg" alt="/icons/compose_green.svg" width="40px" /> Exemple
On a le processus sleep, de numéro 1, lancé en arrière-plan. En effet :
$ jobs
[1]+ Running sleep 100 &
Pour placer cette commande en avant-plan, alors on entre :
$ fg %1
sleep 100
^C # Ctrl-C pour arrêter définitivement le processus
</aside>
</aside>
<aside> <img src="/icons/comment_blue.svg" alt="/icons/comment_blue.svg" width="40px" /> Communiquer avec les processus
Lorsque des processus ont été lancés, nous avons remarqué qu'ils peuvent être arrêtés, redémarrés et tués. Pour cela, nous avons utilisé les commandes Ctrl-Z, Ctrl-C, fg et bg. Ces commandes permettent de communiquer avec les processus en cours d'exécution. En réalité, ces dernières envoient ce qu'on appelle des signaux aux processus. Un signal est un message envoyé à un processus pour lui demander de faire quelque chose.
La commande qui permet d'envoyer des signaux à un processus est kill. Cette commande nécessite le PID du processus à qui envoyer le signal (ou son numéro de tâche si c'en est une). Ainsi Ctrl-Z, Ctrl-C, fg et bg font donc appel à la commande kill pour envoyer des signaux aux processus.
Il existe plusieurs signaux, les plus courants sont les suivants:
SIGINT : signal envoyé par la combinaison de touches Ctrl-C. Il demande au processus de s'arrêter.SIGTSTP : signal envoyé par la combinaison de touches Ctrl-Z. Il demande au processus de se mettre en pause.SIGCONT : signal envoyé par les commandes bg et fg. Il demande au processus de reprendre son exécution.SIGTERM : signal envoyé par la commande kill par défaut. Il demande au processus de s'arrêter.SIGKILL : Il demande au processus de s'arrêter immédiatement et provoque son arrêt brutal, comprenez par là que le processus n'a pas le temps de se terminer correctement. Il est donc déconseillé d'utiliser ce signal.La liste exhaustive des signaux est disponible est obtenu avec commande kill -L.
<aside> <img src="/icons/help-alternate_orange.svg" alt="/icons/help-alternate_orange.svg" width="40px" /> Qui a le droit d'envoyer des signaux à un processus ?
Pour pouvoir affecter un processus, vous devez bien-sûr en être le propriétaire ou être root.
</aside>
</aside>
<aside> <img src="/icons/compose_green.svg" alt="/icons/compose_green.svg" width="40px" /> Exemple
Lançons trois fois le processus gros_processus en arrière-plan :
$ ./gros_processus 1 &
[1] 1501
$ ./gros_processus 2 &
[2] 1503
$ ./gros_processus 3 &
[3] 1505
On veut mettre en pause le processus 1, on entre :
$ kill -SIGTSTP 1501 # On utilise le PID ici
$ jobs
[1]+ Stopped ./gros_processus 1
[2] Running ./gros_processus 2 &
[3]- Running ./gros_processus 3 &
On a bien l’état “Stopped” qui indique la mise en pause.
Maintenant, on veut arrêter le processus 2 :
$ kill -SIGINT %2 # On peut aussi utiliser le numéro de tâche avec %
$ jobs
[1]+ Stopped ./gros_processus 1
[2] Interrupt ./gros_processus 2
[3]- Running ./gros_processus 3 &
On a bien l’état “Interrupt” pour le deuxième processus : en entrant à nouveau la commande jobs, ce processus aura disparu de la liste.
$ jobs
[1]+ Stopped ./gros_processus 1
[3]- Running ./gros_processus 3 &
Puis on souhaite reprendre le processus 1 jusqu’alors mis en pause :
$ kill -SIGCONT %1
$ jobs
[1]+ Running ./gros_processus 1 &
[3]- Running ./gros_processus 3 &
On peut également ordonner l’arrêt propre d’un processus avec SIGTERM. Faisons cela avec le processus 1 :
$ kill -s SIGTERM 1501
$ jobs
[1]+ Terminated ./gros_processus 1
[3]- Running ./gros_processus 3 &
Cette commande laisse au processus le temps de terminer les opérations en cours.
Pour ordonner l’arrêt immédiat et brutal d’un processus, on procède comme ceci (ici avec le processus 3, qui est le seul qui tourne encore) :
$ kill -9 1505
$ jobs
[3]+ Killed ./gros_processus 3
</aside>
<aside> <img src="/icons/comment_blue.svg" alt="/icons/comment_blue.svg" width="40px" /> Archivage et compression de fichiers
</aside>
<aside>
<img src="/icons/comment_blue.svg" alt="/icons/comment_blue.svg" width="40px" /> Commande tar
</aside>