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-}] ...........
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)
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.NI
Valeur standard Unix de gentillesse (nice). Une valeur positive signifie un accès moindre au CPU.SIZE
Taille virtuelle de l’image du processus (code + données + pile).RSS
Taille résidente de l’image du processus. Nombre de kilo-octets se trouvant en mémoire.WCHAN
Nom de la fonction du noyau dans laquelle le processus est endormi.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ôlePAGEIN
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
: disquessar
à la manière deiostat
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
- Compilation et installation de
stress-ng
(http://kernel.ubuntu.com/~cking/stress-ng/)
#!/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
- Installation de collectd-web (http://127.0.0.1/collectd) :
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
- Installation de Cacti : http://linoxide.com/monitoring-2/configure-cacti-fedora-22-centos-7/
12. Cgroups, cpulimit
En cours de développemnt.