3. Processus Linux

1. Visualisation des processus en cours

Les processus sont référencés par un identifiant unique, le PID. Ce nombre peut être utilisé pour changer la priorité d'un processus ou pour l'arrêter.

Un processus correspond à n'importe quel exécutable exécuté. Si le processus 2 a été lancé par le processus 1, on l'appelle un processus fils. Le processus qui l'a lancé est appelé processus parent.

2. L'arborescence des processus

La commande pstree donne une bonne illustration de la hiérarchie des processus parents et fils.

Par exemple, sous debian 7 :

$ pstree
init─┬─acpid
     ├─atd
     ├─cron
     ├─dbus-daemon
     ├─dhclient
     ├─docker.io─┬─bash
     │           ├─controller───9*[{controller}]
     │           ├─rethinkdb─┬─rethinkdb
     │           │           └─69*[{rethinkdb}]
     │           └─12*[{docker.io}]
     ├─7*[getty]
     ├─irqbalance
     ├─rsyslogd───3*[{rsyslogd}]
     ├─sshd───sshd───sshd───bash───pstree

Par exemple, sous Centos 7 :

$ pstree
systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager─┬─dhclient
        │                └─2*[{NetworkManager}]
        ├─2*[abrt-watch-log]
        ├─abrtd
        ├─accounts-daemon───2*[{accounts-daemon}]
        ├─alsactl
        ├─at-spi-bus-laun─┬─dbus-daemon───{dbus-daemon}
        │                 └─3*[{at-spi-bus-laun}]
        ├─at-spi2-registr───{at-spi2-registr}
        ├─atd
        ├─auditd─┬─audispd─┬─sedispatch
        │        │         └─{audispd}
        │        └─{auditd}
        ├─avahi-daemon───avahi-daemon
        ├─caribou───2*[{caribou}]
        ├─chronyd
        ├─colord───2*[{colord}]
        ├─crond
        ├─cupsd
        ├─2*[dbus-daemon───{dbus-daemon}]
        ├─dbus-launch
        ├─dconf-service───2*[{dconf-service}]
        ├─firewalld───{firewalld}
        ├─gdm─┬─Xorg───2*[{Xorg}]
        │     ├─gdm-session-wor─┬─gnome-session─┬─gnome-settings-───4*[{gnome-settings-}]
        │     │                 │               ├─gnome-shell─┬─ibus-daemon─┬─ibus-dconf───3*[{ibus-dconf}]
        │     │                 │               │             │             ├─ibus-engine-sim───2*[{ibus-engine-sim}]
        │     │                 │               │             │             └─2*[{ibus-daemon}]
        │     │                 │               │             └─8*[{gnome-shell}]
        │     │                 │               └─3*[{gnome-session}]
        │     │                 └─2*[{gdm-session-wor}]
        │     └─3*[{gdm}]
        ├─goa-daemon───3*[{goa-daemon}]
        ├─goa-identity-se───2*[{goa-identity-se}]
        ├─gssproxy───5*[{gssproxy}]
        ├─gvfs-afc-volume───2*[{gvfs-afc-volume}]
        ├─gvfs-goa-volume───{gvfs-goa-volume}
        ├─gvfs-gphoto2-vo───{gvfs-gphoto2-vo}
        ├─gvfs-mtp-volume───{gvfs-mtp-volume}
        ├─gvfs-udisks2-vo───2*[{gvfs-udisks2-vo}]
        ├─gvfsd───{gvfsd}
        ├─ibus-x11───2*[{ibus-x11}]
        ├─irqbalance
        ├─login───bash───su───bash───pstree
        ├─lsmd
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─mission-control───2*[{mission-control}]
        ├─packagekitd───2*[{packagekitd}]
        ├─polkitd───5*[{polkitd}]
        ├─pulseaudio───2*[{pulseaudio}]
        ├─qemu-ga
        ├─rngd
        ├─rsyslogd───2*[{rsyslogd}]
        ├─rtkit-daemon───2*[{rtkit-daemon}]
        ├─smartd
        ├─spice-vdagentd
        ├─sshd
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tuned───4*[{tuned}]
        ├─udisksd───4*[{udisksd}]
        ├─upowerd───2*[{upowerd}]
        ├─wpa_supplicant
        └─x2gocleansessio

Les options les plus courantes de pstree sont -p pour afficher les PIDs et -h pour faire ressortir (en gras) les processus utilisateurs.

3. Recherche des processus en cours d'exécution

Une méthode plus directe pour déterminer les processus en cours d'exécution est d'utiliser la commande ps avec une combinaison d'options.

Tentez les différentes commandes :

$ ps
$ ps a
$ ps ax
$ ps aux
$ ps ax | grep cron
Exemples tirés de la page man de ps (en)

  • Tous les processus sur le système en syntaxe standard.
ps -e
ps -ef
ps -eF
ps -ely
  • Tous les processus sur le système en syntaxe BSD.
ps ax
ps axu
  • Impression d'un arbre de processus.
ps -ejH
ps axjf
  • Obtenir des informations sur les "threads".
ps -eLf
ps axms
  • Obtenir des informations de sécurité.
ps -eo euser,ruser,suser,fuser,f,comm,label

Description des champs (page man de ps (fr)

  1. PRI Il s'agit d'un compteur dans la structure représentant la tâche. C'est la fréquence, en HZ des activations possibles du processus.
  2. NI Valeur standard Unix de gentillesse (nice). Une valeur positive signifie un accès moindre au CPU.
  3. SIZE Taille virtuelle de l'image du processus (code + données + pile).
  4. RSS Taille résidente de l'image du processus. Nombre de kilo-octets se trouvant en mémoire.
  5. WCHAN Nom de la fonction du noyau dans laquelle le processus est endormi.
  6. STAT État du processus.

Le premier champ PRI correspond à :

  • R (runnable) prêt à être exécuté,
  • S (sleeping) endormi,
  • D sommeil ininterruptible,
  • T (traced) arrêté ou suivi,
  • Z (zombie).

Le second champ contient W si le processus n'a pas de pages résidentes.

Le troisième NI champ contient N si le processus a une valeur de gentillesse positive (nice, champ NI).

  • TT terminal de contrôle
  • PAGEIN Nombre de fautes de pages majeures (où l'on doit lire des pages sur le disque, y compris dans le buffer cache).
  • TRS Taille de code résident en mémoire.
  • SWAP Nombre de kilo-octets (ou de pages si l'option -p est utilisée) sur le périphérique de swap.
  • SHARE Mémoire partagée.

4. Lancer une tâche dans la console

Pour ces exercices on n'hésitera pas à lire la section intitulé "PROCESS STATE CODES" de la page de la commande ps.

On peut créer un processus :

tail -f /var/log/messages
^Z

[1]+  Stopped                 tail -f /var/log/syslog

et l’arrêter :

ps aux | grep tail
francois 23704  0.0  0.0   7256   620 pts/5    T    14:08   0:00 tail -f /var/log/messages

On peut relancer le processus en tâche de fond avec bg :

bg
[1]+ tail -f /var/log/messages &

On peut reprendre le processus en premier plan dans la console avec fg :

fg
tail -f /var/log/messages
^C

5. Gestion de tâches

On peut lancer directement une tâche en arrière plan en ajoutant & à la commande :

tail -f /var/log/messages &
Pour visualiser les tâches (jobs) :

$ jobs
[1]+  Stopped                 tail -f /var/log/syslog
[2]-  Running                 tail -f /var/log/syslog &
Pour reprendre une tâche en premier plan :

$ fg 2
tail -f /var/log/messages

6. Arrêter un processus

On utilise la commande kill pour envoyer des signaux aux processus. Il existe 63 signaux. Le signal par défaut, nommé SIGTERM, termine le processus et a pour valeur numérique 15.

kill SIGNAL PID

Chaque processus peut choisir ou non de détecter un signal, à l'exception de SIGKILL qui est directement géré par le noyau. On peut également arrêter un processus sans connaître son PID avec la commande killall.

killall SIGNAL NOM_PROCESSUS

On trouve la liste des signaux sous le titre "Standard Signals" de la page man 7 signal

man 7 signal

7. nohup

"Nohup" est une commande Unix permettant de lancer un processus qui restera actif même après la déconnexion de l'utilisateur l'ayant initiée. Combiné à l’esperluette (&) qui permet le lancement en arrière-plan, nohup permet donc de créer des processus s'exécutant de manière transparente sans être dépendants de l’utilisateur.

Par exemple :

# nohup tail -f /var/log/messages &

8. Priorité des processus

Les valeurs de nice (NI pour nice indice) modifient la priorité pour le processeur et sont utilisées pour adapter la charge du processeur dans un environnement multi-utilisateur. Chaque processus est lancé avec la valeur de nice par défaut : 0. Ces valeurs sont comprises entre 19 (la plus petite) et -20 (la plus importante). (moins un processus est gentil, plus il consomme de puissance).

Seul le super-utilisateur root peut diminuer la valeur nice d'un processus. En conséquence, tous les processus étant lancés par défaut avec un nice à 0, seul le root peut définir des valeurs de nice négatives !

9. nice / renice

On utilise la commande renice pour modifier la priorité d'un processus en cours d'exécution, et la commande nice pour définir la priorité d'un processus à son lancement.

nice –<NI>  <processus>
renice  <+/-NI>  -p <PID>

renice utilise les PID et peut gérer une liste de processus à la fois. L'option -u affecte tous les processus d'un utilisateur peut être très utile.

Exemples :

  • passage des valeurs de nice à 1 pour les processus 234 et 765
renice +1  -p 234 765
  • lancer xclock avec une valeur de nice à -5
nice  --5  xclock

Pour vérifier les valeurs nice :

ps -lax | head

10. Mesure de l'utilisation des ressources et résolution de problèmes

Objectif LPIC 200.1

  • Ajout des dépôts EPEL et RPMFORGE : https://gist.github.com/goffinet/4332ae9486345c2bf623
  • uptime : 1, 5, 15 minutes sur tous les CPUs
  • Installation de iostat sous Centos 7 : yum install sysstat
  • Sortie iostat : avg-cpu: %user %nice %system %iowait %steal %idle
  • iostat -c: CPU / iostat -d : disques
  • sar à la manière de iostat offre un historique dans une cadence de 10 minutes
sar | tail
  • stress (EPEL) à installer (ici, 2 CPU, 1 VM, 1 IO)
uptime
stress -c 2 -i 1 -m 1 --vm-bytes 128M -t 10s
uptime
#!/bin/bash
yum -y install git || apt-get install git
yum -y groupinstall 'Development Tools' || apt-get install build-essential git
cd /tmp
git clone git://kernel.ubuntu.com/cking/stress-ng.git
cd stress-ng
make
cp stress-ng /usr/bin
rm -rf /tmp/stress-*
  • free -h, vmstat
  • iostat -d : bi et bo, lsblk, blkid
  • lsof -u ^root, lsof -i TCP:22, lsof -p 100
  • lsof /usr/ bin/bash
  • option netstat: -l (listening), -lu (listening UDP sockets), -lt (listening TCP sockets), -p (PID), -n (numérique), -c (continu), -r (table de routage)
  • ps -fe, pstree, top, htop
  • Commande w

11. Prévision des besoins en ressources

Objectif LPIC 200.2

$ top
$ htop
yum install collectd-web
systemctl enable collectd
systemctl enable httpd
systemctl start collectd
systemctl start httpd
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
cat /etc/httpd/conf.d/collectd.conf
Configuration for collectd.

Alias /collectd/ /usr/share/collectd/collection3/

<Directory "/usr/share/collectd/collection3/">
    Require local
    # Require all granted
    DirectoryIndex bin/index.cgi
    DirectoryIndexRedirect on
</Directory>

<Directory "/usr/share/collectd/collection3/etc/">
    Require all denied
</Directory>

<Directory "/usr/share/collectd/collection3/lib/">
    Require all denied
</Directory>

<Directory "/usr/share/collectd/collection3/share/">
    Require local
    # Require all granted
</Directory>

<Directory "/usr/share/collectd/collection3/bin/">
    Options ExecCGI
    AddHandler cgi-script .cgi
    Require local
    # Require all granted
</Directory>
cat /etc/collectd.conf | wc -l

12. Cgroups, cpulimit

En cours de développemnt.

Commentaires