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

1. Processus et tâches

<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 :

La liste des processus affichée contient quatre colonnes par défaut :

<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.

</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

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 :

Untitled

</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 :

Par 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 :

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>

2. Envoyer des signaux à un processus

<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-ZCtrl-Cfg 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-ZCtrl-Cfg et bg font donc appel à la commande kill pour envoyer des signaux aux processus.

Il existe plusieurs signaux, les plus courants sont les suivants:

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>

3. Archivage de fichiers et répertoires

<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>