htop expliqué, partie 3 : les processus

Après une première partie consacrée à l’uptime et la seconde à la load average, voici la troisième partie traduite de l’excellent article htop explained : Explanation of everything you can see in htop/top on Linux.

Article arrivé 1er sur Hacker News, 1er sur /r/sysadmin, 2nd sur /r/linux), traduit avec l’accord de son auteur Pēteris Ņikiforovs, il présente la commande htop et les notions de base des composants d’un système GNU/Linux que cette commande affiche.

Aujourd’hui : les processus (notions d’ID, PID et d’arborescence de processus).


htop

Processus

Dans le coin en haut à droite, htop affiche le nombre total de processus et combien sont en cours d’exécution. Mais il est indiqué tasks (ndt : tâches) et non processus. Pourquoi ?

Un autre nom pour un processus est une tâche. Le noyau Linux se réfère en interne aux processus comme des tâches. htop utilise tasks au lieu de processus probablement parce que c’est plus court et économise de l’espace sur l’écran.

Vous pouvez aussi voir les threads (ndt : fil d’exécution ou processus léger) dans htop. Pour activer la vue des threads,  appuyez sur Shift+H sur votre clavier. Si vous voyez Tasks: 23, 10 thr, cela signifie qu’ils sont visibles.

Vous pouvez également voir les threads noyau (ndt : kernel threads) avec Shift+K. Quand ils sont visibles, cela dira Tasks: 23, 40 kthr.

ID / PID d’un processus

À chaque fois qu’un nouveau processus est lancé, il se voit assigné un identifiant (ID) que l’on appelle ID de processus ou PID en abrégé.

Si vous lancez un programme en arrière-plan (&) depuis bash, vous verrez le numéro de job entre crochets et le PID.

$ sleep 1000 &
[1] 12503

Si vous l’avez manqué, vous pouvez utiliser la variable $! en bash qui rappelera le dernier ID de processus en arrière-plan.

$ echo $!
12503

L’identiant d’un processus est très utile. Il peut être utilisé pour afficher les détails du processus et le contrôler.

procfs est un pseudo système de fichiers qui laisse les programmes en espace utilisateur obtenir des informations du noyau en lisant des fichiers. Il est habituellement monté sur /proc/ et pour vous il ressemble à un répertoire régulier dans lequel vous pouvez naviguer avec ls et cd.

Toutes les informations relatives à un processus sont accessibles via /proc/<pid>/.

$ ls /proc/12503
attr coredump_filter fdinfo maps ns personality smaps task
auxv cpuset gid_map mem numa_maps projid_map stack uid_map
cgroup cwd io mountinfo oom_adj root stat wchan
clear_refs environ limits mounts oom_score schedstat statm
cmdline exe loginuid mountstats oom_score_adj sessionid status
comm fd map_files net pagemap setgroups syscall

Par exemple, /proc/<pid>/cmdline donnera la commande qui a été utilisée pour lancer le processus.

$ cat /proc/12503/cmdline
sleep1000$

Arf, c’est pas ça. Il s’avère que la commande est séparée par l’octet \\0.

$ od -c /proc/12503/cmdline
0000000 s l e e p \\0 1 0 0 0 \\0
0000013

que nous pouvons remplacer avec une espace ou une nouvelle ligne

$ tr '\\0' '\\n' < /proc/12503/cmdline
sleep
1000
$ strings /proc/12503/cmdline
sleep
1000

Le répertoire du processus pour un processus donné peut contenir des liens ! En l’occurrence, cwd pointe vers le répertoire de travail courant et exe est le binaire exécuté.

$ ls -l /proc/12503/{cwd,exe}
lrwxrwxrwx 1 ubuntu ubuntu 0 Jul 6 10:10 /proc/12503/cwd -> /home/ubuntu
lrwxrwxrwx 1 ubuntu ubuntu 0 Jul 6 10:10 /proc/12503/exe -> /bin/sleep

Donc c’est comme ça que htop, top, ps et les autres utilitaires de diagnostic obtiennent leurs informations au sujet des détails d’un processus : ils les lisent depuis /proc/<pid>/<file>.

L’arborescence des processus

Quand vous lancez un nouveau processus, le processus qui lance le nouveau processus s’appelle le processus parent. Le nouveau processus est un processus enfant pour le processus parent. Ces relations forment une structure arborescente.

Si vous appuyez sur F5 dans htop, vous pouvez voir la hiérarchie des processus.

Vous pouvez également utiliser l’argument f avec ps.

$ ps f
 PID TTY STAT TIME COMMAND
12472 pts/0 Ss 0:00 -bash
12684 pts/0 R+ 0:00 \\_ ps f

ou pstree

$ pstree -a
init
 ├─atd
 ├─cron
 ├─sshd -D
 │ └─sshd
 │ └─sshd
 │ └─bash
 │ └─pstree -a
...

Si vous vous êtes déjà demandé pourquoi vous voyez souvent bash ou sshd comme les parents de vos processus, voilà pourquoi.

Voilà ce qui se passe quand vous lancez, disons, date depuis votre shell bash :

  • bash créé un nouveau processus qui est une copie de lui-même (en utilisant l’appel système fork)
  • il charge ensuite en mémoire le programme depuis le fichier exécutable /bin/date (en utilisant l’appel système exec)
  • bash, en tant que processus parent, attendra que son enfant se termine

Donc /sbin/init avec l’ID de 1 a été lancé au démarrage, lequel a lancé le démon SSH sshd. Quand vous vous connectez à l’ordinateur, sshd lancera à son tour un processus pour la session qui à son tour lancera le shell bash

J’aime utiliser la vue arborescente quand cela m’intéresse de voir tous les threads.


J’espère que vous avez appréciez entrer un peu plus en profondeur dans le fonctionnement de votre système et en particulier des processus. Le prochain article devrait arriver très rapidement et continuera l’étude des processus.

Vus : 669
Publié par Carl Chenet : 277