Les Processus




1 Le principe

Lorsque vous installez Linux, ou lorsque vous souhaitez installer un nouveau programme, vous devez choisir lesquels démarrer et comment les démarrer. Enfin par la suite la question est comment je l'arrête, comment je modifie sa configuration, comment je sais si il tourne. 
Un programme n'est qu'un simple fichier dans lequel vous avez mis des commandes. Lorsque vous lancez ce programme celui ci va être pris en charge par le système. Le couple programme environnement devient  un processus.
Linux étant un système multitâche, plusieurs programmes peuvent tourner en même temps, ce qui demande que le programme soit identifié et que soit organisé par le système une répartition des ressources entre les différents programmes. 
Enfin lorsqu'un programme est lancé, il doit être possible de continuer à travailler, il est donc nécessaire de pouvoir lancer ce programme en tâche de fond. 
 

2 Les modes de démarrage

Dans un système Linux vous disposez de plusieurs méthodes pour lancer un processus. 
- Le système V (niveau d'exécution ou runlevel).   
- Inetd comme par exemple telnet ou ftp. Cela est connu sous le nom de Tcp wrappers
- Le fichier de démarrage  /etc/rc.d/rc.local. Vous pouvez placer dans ce fichier les processus propre à votre machine. Ils sont démarrés en dernier.
- Enfin taper simplement la commande (par exemple pour lancer named taper ./named si vous êtes dans le répertoire ou se trouve l'exécutable). Vous pouvez aussi appeler le script de démarrage /etc/rc.d/init.d/named start.

Au démarrage de la machine, si vous avez installé LILO, celui-ci lance le noyau à savoir le fichier /boot/vmlinuz-2.2.16-xx, le numéro représente la version du noyau utilisée.

- le noyau recherche init, et exécute le premier qui a été trouvé (normalement situé dans /sbin).
Le programme Init démarre tous les processus constituant le système Linux (en en devenant le parent). Il commence par exécuter /etc/rc.d/rc.sysinit, qui définit votre chemin d'accès, démarre la prise en charge de l'espace swap, vérifie les systèmes de fichiers, etc. rc.sysinit s'occupe de tout ce dont votre système a besoin pour s'initialiser. Par exemple, si vous avez configuré votre machine pour le réseau, rc.sysinit utilise les informations figurant dans les fichiers /etc/sysconfig/network et /etc/sysconfig/clock pour initialiser les processus réseau et l'horloge. Il peut également exécuter rc.serial si vous avez des processus de port série nécessitant une initialisation.

Puis le programme Init examine et implémente le fichier /etc/inittab. Le fichier /etc/inittab décrit la manière dont le système doit être configuré à chaque niveau d'exécution et définit le niveau d'exécution par défaut.
id:3:initdefault:                                                      Indique le niveau de démarrage par défaut. 
ca::ctrlaltdel:/sbin/shutdown -a -t3 -r now             Pour définir l'action sur les touches ALT CTRL DEL
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"   Pour la gestion des onduleurs

Ce fichier indique aussi que /etc/rc.d/rc et /sbin/update doivent être exécutés chaque fois qu'un niveau d'exécution commence. Enfin il indique le fichier nécessaire lorsque vous démarrez au niveau 5 (interface X). x:5:respawn:/etc/X11/prefdm -nodaemon.
On peut aussi utiliser ce fichier pour lancer directement une application. Ce n'est pas l'objet de cette formation.

Enfin le fichier rc.local est lu.

3 Le système V

Sur les distributions du type Red Hat, Mandrake.. vous disposez de 6 niveaux de démarrage. Chacun de ces niveaux correspond à un état de votre machine. 

Niveau 0 Etat d'arrêt de votre machine. Ainsi si vous tapez init 0 vous arrêtez votre machine.
Niveau 1 Etat de démarrage en simple utilisateur. Vous n'avez pas besoin de rentrer de nom et de mot de passe à ce niveau. Si vous avez perdu votre mot de passe root vous pouvez vous en sortir en démarrant à ce niveau.
Niveau 2 Etat identique au niveau 3 sans NFS. 
Niveau 3 Etat par défaut. Tous les services réseau sont démarrés.
Niveau 4 Il n'est pas utilisé sur certain distribution. Vous pouvez toujours l'utiliser pour vous même.
Niveau 5 Identique au niveau 3, avec en plus le serveur X. Vous démarrez donc avec l'interface graphique. 
Niveau 6 Reboot de la machine. Si vous faites init 6 sur la ligne de commande celle ci va redémarrer. Equivalent à reboot.

Il existe des petites différences entre les distributions quant à l'utilisation des niveaux.
Cela est défini dans le fichier /etc/inittab et est démarré par init.

Lorsque vous souhaitez démarrer un service, il vous faut placer dans /etc/rc.d/init.d le script de démarrage de votre application puis de créer un lien symbolique dans chacun des répertoires /etc/rc.d/rc0.d (et les autres rc1.d rc2.d  ...), avec comme règle de créer ce lien symbolique avec un nom commençant par S (comme Start) et un K (comme K). Les liens symboliques commençant par K sont lus les premiers, et le numéro indique l'ordre dans lequel les fichiers seront lus (normalement lorsque vous faites une installation à partir d'un rpm cela est fait automatiquement).
Ainsi pour named par exemple (le serveur dns) vous devez créer les liens symboliques vers le script de démarrage : 

ln -s /etc/rc.d/init.d/named /etc/rc.d/rc0.d/K40named  
Au niveau d'arrêt 0 on l'arrête
ln -s /etc/rc.d/init.d/named /etc/rc.d/rc1.d/K40named  
Vous n'avez pas de réseau en marche, donc named ne sert à rien
ln -s /etc/rc.d/init.d/named /etc/rc.d/rc2.d/K40named    On peut éventuellement le mettre en route ici
ln -s /etc/rc.d/init.d/named /etc/rc.d/rc3.d/S40named     A ce niveau il doit être démarré
ln -s /etc/rc.d/init.d/named /etc/rc.d/rc4.d/K40named     Au 4 il n'y a rien sur la Red Hat
ln -s /etc/rc.d/init.d/named /etc/rc.d/rc5.d/S40named      Au 5 si vous démarrez avec le serveur X démarrez le
ln -s /etc/rc.d/init.d/named /etc/rc.d/rc6.d/K40named     Le niveau 6 étant le reboot il faut le stopper 

Vous pouvez aussi utiliser la commande chkconfig --add named pour faire cela ou bien l'interface ntsysv.


Ou l'interface graphique X.

Chaque lien appelle en fait un script de démarrage de named voici un de ces scripts. Vous pouvez bien sur les créer vous même, ils se ressemblent tous quant au principe.

#!/bin/sh
# chkconfig: - 55 45                     Utilisez par chkconfig pour créer les liens symboliques correctement.
# See how we were called.
case "$1" in
start)
# Start daemons.
echo -n "Starting named: "
daemon named -u named
touch /var/lock/subsys/named
echo
;;
stop)
# Stop daemons.
echo -n "Shutting down named: "
killproc named
rm -f /var/lock/subsys/named
echo
;;

Ce fichier a volontairement été simplifié. Il peut être nécessaire lorsque l'on crée ce type de script de vérifier que les fichiers de configuration de votre programme sont bien là, que le réseau par exemple est bien configuré etc...
Vous pouvez aussi démarrer named (et les autres bien sur) après le démarrage de votre machine. Pour cela puisque le fichier /etc/rc.d/init.d/named existe ajoutez à cette commande start pour démarrer, stop pour arrêter, restart pour redémarrer. 

4  Quels services lancer au démarrage

La réponse est simple, le moins possible. Il ne faut lancer que les services dont vous avez besoin, et démarrer les autres à la demande. De plus vous n'êtes pas obligé de démarrer certains services pour pouvoir les utiliser en local, par exemple linuxconf, peut être lancé au démarrage de la machine, il va alors rester en écoute sur le port tcp 98 mais cela n'est utile que si vous souhaitez pouvoir configurer votre machine à distance, il va de soi que je ne vous le conseille pas.

Quelques services à connaître :

amd Active le service NFS
arpwatch Construit une base de données des adresses Ethernet/MAC de votre réseau local
autofs Active le montage automatique de NFS
bootparamd Utiliser pour les machines ne disposant pas de disque dur 
dhcpd Serveur dhcp
gated démon de routage à utiliser à la place de routed
httpd Le serveur apache
inet Le démon de TCP Wrappers
innd Le démon de usenet
linuxconf Vous permet d'utiliser linuxconf via une interface web donc depuis une autre machine.
lpd Serveur d'imprimante
mars-nwe Active le serveur d'imprimante et de fichier Netware
mcserv Active le serveur Midnight Commander, permettant son utilisation depuis une autre machine
named Démon du serveur DNS Bind
netfs Monte le système de fichiers NFS,Samba, Netware
network Active le réseau
nfs Service NFS
pcmcia Utilisé pour les portable
portmap Active RPC, utile pour NFS et NIS
 postgresql Serveur SQL postgres
routed Permet de mettre à jour les tables de routage dynamique du noyau
sendmail  Serveur SMTP fort célèbre 
smb Démon du serveur de fichier Samba
syslog démon de gestion des logs de votre système
xntpd Serveur de temps.


5 Visualiser les processus

ps donne la liste des processus,  On utilise aussi la commande top pour voir ce qui tourne sur la machine.

La commande ps (voir man ps pour toutes les options)

Exemple de liste (je n'ai gardé que deux lignes mais il y en a beaucoup d'autres) :

[root@aleu /etc]# ps aux

USER PID %CPU %MEM SIZE RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 1064 476 ? S 14:54 0:00 init [3]
nobody 1134 15.5 3.1 5528 4056 ? S 14:55 0:00 squid -D

Chaque processus possède un numéro PID unique. init le processus parent de tous, possède le numéro 1.
  • USER : nom du propriétaire
  • PID : numéro du processus
  • PPID : numéro du processus parent
  • PRI : Facteur de priorité
  • %CPU : pourcentage de cpu utilisé
  • %MEM : % mémoire occupée
  • SIZE : Taille de l'image; taille de text+data+stack
  • RSS : Resident set size; kilobytes de programme en mémoire
  • TTY : terminal contrôlant le processus
  • STAT : status
  • START : date de démarrage
Status STAT d'un processus:
  • R : prêt à être exécuté
  • S : processus endormi
  • D : processus endormi inintérrompable
  • T : processus arrêté ou suivi
  • Z : processus zombie 
  • W : processus n'ayant pas de pages résidentes (en 2e position)
  • N en 3e position indique une nice valeur >0 (Champ NI)

 

Le numéro de PID peut être stocké dans un fichier se trouvant dans /var/run sous le nom du démon, par exemple squid lorsqu'il démarre crée un fichier squid.pid. Ainsi pour avoir le pid de squid vous pouvez faire cat /var/run/squid.pid. Cela peut être utile pour "killer" votre processus en tapant la commande kill 'cat /var/run/squid.pid'.


6 Envoyer un signal à un processus (Stopper, forcer la relecture du fichier de configuration).

  
         Pour envoyer un signal à un processus il vous faut connaître son nom ou son PID (identifiant unique).Vous disposez de deux commandes possibles kill (à utiliser avec le PID du processus) ou killall (à utiliser avec le nom du processus). 
Pour obtenir le numéro de PID de squid vous pouvez faire ps ax |grep squid
Certains processus refusent de s'arrêter tant qu'il n'ont pas terminé les actions en cours. Utiliser alors le signal 9 qui tue le processus sans lui laisser le temps de finir ce qu'il est en train de faire. kill -9 1134  tue le processus dont le PID est 1134 sans sommation.

Lorsque vous modifiez le fichier de configuration d'un programme, vous n'êtes pas obligé de le relancer, vous pouvez l'obliger à relire son fichier de configuration. Pour cela envoyez le signal -1 ou HUP. Ainsi la commande killall -HUP squid oblige squid à relire son fichier de configuration.

Il est toujours possible d'utiliser les scripts de démarrage pour stopper un processus. Par exemple /etc/rc.d/init.d/squid stop pour arrêter squid (en fait le script envoi un kill à squid). Si le script le permet on peut aussi envoyer un restart pour redémarrer le programme, à savoir /etc/rc.d/init.d/squid restart redémarre squid (attention il y a arrêt et redémarrage de squid), ce qui peut provoquer par exemple dans le cas de sendmail la perte de messages. Donc préférez autant que possible un kill -HUP.

Il existe d'autres signaux, pour les connaître faire kill -l. On peut aussi envoyer des signaux via les touches du clavier. Par exemple CTRL Z suspend un processus (kill -STOP pid). CTRL C stoppe un processus. Vous pouvez utiliser la commande stty -a pour connaître les autres.


7 Les processus en arrière plan

Pour lancer un processus en arrière plan, démarrez le avec l'option & à la fin. Prenons l'exemple de top, qui vous permet de suivre les processus qui tournent sur votre machine. Si vous lancez top sans rien, vous ne pouvez plus rien faire sur la console sur laquelle vous étiez. Quittez top (q) et lancez le avec le & à la fin top &. Vous ne voyez plus rien et vous pouvez continuer à travailler. Pourtant le programme est bien lancé (top est un très mauvais exemple car il a besoin d'afficher des résultats sur la console, mais bon).  
Pour constater qu'il est bien en tâche de fond utilisez la commande jobs. Vous obtenez alors la liste des programmes que vous avez placé en tâche de fond.
Si vous souhaitez maintenant ramener ce programme au premier plan taper fg  ou fg %1 (je suppose ici que le numéro de tâche est 1, vous pouvez l'obtenir avec la commande jobs).
Maintenant vous avez déjà démarré votre programme, et vous souhaitez l'envoyer en arrière plan. Vous devez tout d'abord le suspendre en utilisant CTRL Z puis bg ou bg %1 pour l'envoyer en arrière plan.  
Vous devez vérifier que votre processus en arrière plan est bien actif (commande ps). Si ce n'est pas le cas envoyez lui un 
kill -CONT pid (pid étant le numéro de pid du processus). Vous constatez ici que mon exemple est vraiment mauvais car top refuse d'être actif en arrière plan... et pour cause.
La notion d'arrière plan n'a un sens que sur une même console. Si vous ouvrez une autre console le processus se trouve naturellement en tâche de fond pour cette autre console.

8 Les commandes liées à la gestion des processus.

Voici les commandes qu'il vous faut connaître pour gérer les processus, ou pour lancer des programmes. Je reprends ici certaines commandes déjà vue.

Commandes Options  Remarques
ps Affiche un état instantané des processus en cours a : Pour voir aussi les processus des autres utilisateurs
x: Pour voir les processus de tous les terminaux
l: liste longue
u: Pour avoir le nom de l'utilisateur et l'heure de démarrage
f: affiche l'arbre des processus parents et enfants.
ps aux | grep squid Affiche uniquement les lignes contenant squid Remarquez l'utilisation du | (pipe) pour envoyer le résultat d'une commande à une autre commande 
pstree  permet de connaître les filiations entre le processus Commande presque équivalente ps axf (f comme filiation)
kill Permet d'envoyer un signal au processus en utilisant son numéro de PID  
killall Permet d'envoyer un signal au processus en  utilisant son nom.  
kill -9 1134  tue le processus ayant pour numéro de PID 1134 On peut utiliser killall -9 squid 
killall -1 squid Oblige squid à relire son fichier de confiuration killall -HUP squid ou kill -HUP 1134
kill -CONT 1134 Réactive un processus se trouvant en arrière plan  
kill -STOP 1134 Suspend un processus en arrière plan  
kill -l affiche tous les signaux disponibles  
nohup Exécute la commande désirée en ignorant le signal de déconnexion (HANGUP) de l'utilisateur qui l'a lancé. Le programme continu donc de courir lorsque vous vous êtes déconnecté.  
jobs donne la liste des programmes fonctionnant en tâche de fond  
bg Place un programme en tâche de fond Indiquer le numéro tâche si vous en avez plusieurs avec un %
Vous obtenez ce numéro avec la commande jobs
fg  Replace un programme au premier plan idem
init Pour changer de niveau d'exécution Pour passer du niveau 3 (défaut) au niveau 1 taper init 1
runlevel Pour connaître le niveau dans lequel vous êtes  
pidof Affiche le pid d'un processus. Utilisé dans les scripts. pidof est en fait un lien symbolique sur killall5 
chkconfig Permet de créer ou de supprimer les liens symboliques pour démarrer ou stopper un processus avec le système V --list Pour avoir la liste des processus qui sont démarrés ou arrêtés.
--add squid pour ajouter squid 
--del squid pour enlever squid (le fichier de script se trouvant dans /etc/rc.d/init.d/ n'est pas affecté).
netstat -na Permet de connaître les ports en écoute sur votre machine. Par exemple si sendmail tourne vous devez avoir le port 25 à l'écoute.  

TP1: On utilise pour ce TP un petit "truc" qui affiche à l'écran des y sans fin. 


© Philippe Chadefaux - 10/2/2001 -