Le système d'exploitation GNU-Linux/Processus

Un livre de Wikilivres.



Définition d'un processus[modifier | modifier le wikicode]

Un processus est un programme en cours d'exécution. Par exemple, chaque fois que l'on lance la commande ls, un processus est créé durant l'exécution de la commande.

Un processus est identifié par un numéro unique que l'on appelle le PID (Process IDentifiant).

Un processus dispose d'un processus père que l'on appelle le PPID (Parent PID).

La particularité d'un processus est de s'exécuter avec les droits accordés à l'utilisateur qui a lancé la commande. Ceci participe fortement à la sécurité du système. Ainsi, si un utilisateur contracte un programme malveillant (un virus par exemple), le processus sera soumis au droit d'accès de cet utilisateur, et ne pourra pas effectuer des opérations non autorisées (comme par exemple modifier le fichier de mots de passe).

Au démarrage de l'ordinateur, le système charge le noyau Linux qui se charge de l'initialisation du matériel et de la détection des périphériques. Ceci fait, il démarre ensuite le processus init qui a comme particularité d'être le premier processus et de toujours utiliser le PID 1. Ce processus démarre ensuite des processus noyaux (dont le nom est noté entre crochets), et les premiers processus systèmes.

Chaque processus a ainsi un père (sauf init), et peut être à son tour le père d'autres processus, etc.

La commande pstree permet de visualiser l'arbre des processus. L'option -p permet de visualiser les PID de chaque processus.

Exemple :

 $ pstree -p
 init(1)─┬─atd(2861)
         ├─avahi-daemon(2647)───avahi-daemon(2648)
         ├─cron(2873)
         ├─cupsd(2571)
         ├─dbus-daemon(2579)
         ├─dbus-daemon(3023)
         ├─dbus-launch(3022)
         ├─dcopserver(3054)
         ├─dhcdbd(2628)
         ├─dirmngr(3221)
         ├─events/0(4)
         ├─exim4(2739)
         ├─gconfd-2(3576)
         ├─gdm(2796)───gdm(2802)─┬─Xorg(2805)
         │                       └─startkde(2971)─┬─kwrapper(3063)
         │                                        └─ssh-agent(3019)
         ├─getty(2902)
         ├─getty(2903)
         ├─getty(2904)
         ├─getty(2905)
         ├─getty(2906)
         ├─getty(2907)
         ├─hald(2587)───hald-runner(2588)─┬─hald-addon-keyb(2594)
         │                                └─hald-addon-stor(2621)
         ├─hpiod(2464)
         ├─inetd(2756)
         ├─kaccess(3073)
         ├─kded(3058)
         ├─kdeinit(3051)─┬─artsd(3077)
         │               ├─firefox-bin(3572)─┬─{firefox-bin}(3573)
         │               │                   ├─{firefox-bin}(3574)
         │               │                   ├─{firefox-bin}(3581)
         │               │                   ├─{firefox-bin}(3586)
         │               │                   ├─{firefox-bin}(3587)
         │               │                   └─{firefox-bin}(3588)
         │               ├─kio_file(3071)
         │               ├─klauncher(3056)
         │               ├─konsole(3308)───bash(3309)───pstree(4518)
         │               ├─konsole(3907)───bash(3908)───su(3925)───bash(3926)
         │               └─kwin(3066)
         ├─kdesktop(3068)
         ├─kdesud(3357)
         ├─khelper(5)
         ├─kicker(3070)
         ├─klipper(3085)
         ├─klogd(2446)
         ├─knotify(3082)
         ├─korgac(3086)
         ├─ksmserver(3065)
         ├─ksoftirqd/0(3)
         ├─kthread(6)─┬─aio/0(76)
         │            ├─ata/0(594)
         │            ├─ata_aux(595)
         │            ├─hda_codec(1575)
         │            ├─kblockd/0(9)
         │            ├─khubd(529)
         │            ├─kjournald(1012)
         │            ├─kjournald(1916)
         │            ├─kjournald(1918)
         │            ├─kjournald(1920)
         │            ├─kjournald(1922)
         │            ├─kmirrord(1874)
         │            ├─kpsmoused(1551)
         │            ├─kseriod(12)
         │            ├─kswapd0(75)
         │            ├─pdflush(73)
         │            ├─pdflush(74)
         │            ├─scsi_eh_0(653)
         │            └─scsi_eh_1(655)
         ├─migration/0(2)
         ├─portmap(2192)
         ├─python(2491)
         ├─rpc.statd(2810)
         ├─soffice(4472)───soffice.bin(4492)─┬─{soffice.bin}(4493)
         │                                   ├─{soffice.bin}(4494)
         │                                   ├─{soffice.bin}(4495)
         │                                   ├─{soffice.bin}(4496)
         │                                   └─{soffice.bin}(4497)
         ├─start_kdeinit(3050)
         ├─syslogd(2440)
         └─udevd(1192)

Dans cette arborescence, on constate que le processus init est bien le père de tous les processus.

Afficher la liste des processus[modifier | modifier le wikicode]

La commande ps permet d'afficher les processus. Utilisée sans option, la commande ps affiche les processus de l'utilisateur courant associé au terminal courant.

Pour connaître tous les processus, y compris ceux qui ne sont pas associés au terminal courant, on utilise les options aux (notation BSD) et -ef (notation Unix). Pour connaître la totalité des options, consulter la page de manuel de la commande ps (man ps).

Exemples :

 $ ps aux
 pixl@nitroglycerine:~$ ps aux
 USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
 root         1  0.0  0.0   1944   644 ?        Ss   11:36   0:00 init [2]
 root         2  0.0  0.0      0     0 ?        S    11:36   0:00 [migration/0]
 root         3  0.0  0.0      0     0 ?        SN   11:36   0:00 [ksoftirqd/0]
 root         4  0.0  0.0      0     0 ?        S<   11:36   0:00 [events/0]
 root         5  0.0  0.0      0     0 ?        S<   11:36   0:00 [khelper]
 ...
 daemon    2192  0.0  0.0   1684   376 ?        Ss   11:36   0:00 /sbin/portmap
 root      2440  0.0  0.0   1628   640 ?        Ss   11:36   0:00 /sbin/syslogd
 root      2446  0.0  0.0   1576   376 ?        Ss   11:36   0:00 /sbin/klogd -x
 root      2464  0.0  0.0   4884   916 ?        Ss   11:36   0:00 /usr/sbin/hpiod
 ...
 $ ps -ef
 UID        PID  PPID  C STIME TTY          TIME CMD
 root         1     0  0 11:36 ?        00:00:00 init [2]
 root         2     1  0 11:36 ?        00:00:00 [migration/0]
 root         3     1  0 11:36 ?        00:00:00 [ksoftirqd/0]
 root         4     1  0 11:36 ?        00:00:00 [events/0]
 root         5     1  0 11:36 ?        00:00:00 [khelper]
 ...
 daemon    2192     1  0 11:36 ?        00:00:00 /sbin/portmap
 root      2440     1  0 11:36 ?        00:00:00 /sbin/syslogd
 root      2446     1  0 11:36 ?        00:00:00 /sbin/klogd -x
 root      2464     1  0 11:36 ?        00:00:00 /usr/sbin/hpiod
 ...

Au final, on obtient les mêmes résultats.

Les signaux[modifier | modifier le wikicode]

Définition[modifier | modifier le wikicode]

Les signaux offrent un mécanisme permettant d'envoyer un message à un processus en cours d'exécution. On se sert généralement des signaux pour terminer un processus, lui indiquer de relire sa configuration, etc.

Les différents signaux[modifier | modifier le wikicode]

Pour connaître la liste des signaux, il suffit de consulter la page de manuel de signal (section 7) :

 $ man 7 signal
 ...
 Signal     Valeur    Action   Commentaire
 ---------------------------------------------------------------------
 SIGHUP        1       Term    Déconnexion détectée sur le terminal
                               de contrôle ou mort du processus de
                               contrôle.
 SIGINT        2       Term    Interruption depuis le clavier.
 SIGQUIT       3       Core    Demande « Quitter » depuis le clavier.
 SIGILL        4       Core    Instruction illégale.
 SIGABRT       6       Core    Signal d’arrêt depuis abort(3).
 SIGFPE        8       Core    Erreur mathématique virgule flottante.
 SIGKILL       9       Term    Signal « KILL ».
 SIGSEGV      11       Core    Référence mémoire invalide.
 SIGPIPE      13       Term    Écriture dans un tube sans lecteur.
 SIGALRM      14       Term    Temporisation alarm(2) écoulée.
 SIGTERM      15       Term    Signal de fin.
 SIGUSR1   30,10,16    Term    Signal utilisateur 1.
 SIGUSR2   31,12,17    Term    Signal utilisateur 2.
 SIGCHLD   20,17,18    Ign     Fils arrêté ou terminé.
 SIGCONT   19,18,25    Cont    Continuer si arrêté.
 SIGSTOP   17,19,23    Stop    Arrêt du processus.
 SIGTSTP   18,20,24    Stop    Stop invoqué depuis tty.
 SIGTTIN   21,21,26    Stop    Lecture sur tty en arrière-plan.
 SIGTTOU   22,22,27    Stop    Écriture sur tty en arrière-plan.

Les signaux les plus connus sont les trois suivants :

  • SIGHUP (signal n°1) : pour beaucoup de services réseaux, la réception du signal n°1 lui indique de lire sa configuration. Par exemple, cela permet d'indiquer au processus apache (serveur web) de relire sa configuration, sans avoir a arrêter et redémarrer le processus.
  • SIGKILL (signal n°9) : termine un processus (arrêt brutal). Utile lorsque le SIGTERM ne marche pas (processus planté).
  • SIGTERM (signal n°15) : demande au processus de s'arrêter (arrêt propre).


Envoyer un signal à un processus[modifier | modifier le wikicode]

kill[modifier | modifier le wikicode]

La commande kill permet d'envoyer un signal au processus. Syntaxe :

 $ kill -<numéro du signal ou nom du signal> <PID du processus>

Exemples :

  $ kill -1 12345
  $ kill -SIGTERM 12345
 On peut connaitre le PID du processus à partir de son nom, en utilisant la commande ps, ou bien pidof.

Exemple :

  $ pidof cupsd
  2571
  $ kill -15 2571

ou directement :

  $ kill `pidof java`

(ce qui fonctionne aussi s'il y a plusieurs processus du même nom)

killall[modifier | modifier le wikicode]

La commande killall permet d'indiquer le nom du processus plutôt que son PID, et va envoyer le signal à tous les processus possédant ce nom. Exemple :

 $ xeyes & ; xeyes & ; xeyes &
 $ killall xeyes

Utilisé sans option, les commandes kill et killall envoient le signal n°15 (arrêt propre).

pkill[modifier | modifier le wikicode]

Pour tuer un processus par son nom.

Par exemple pour killer une session bloquée :

$ w
USER    TTY
my_user pts/0
my_user pts/1

$ pkill -9 -t pts/0

Autres commandes affichant les processus[modifier | modifier le wikicode]

La commande top permet d'afficher (entre autres) la liste des processus de manière dynamique (rafraîchit la liste toutes les 3 secondes).

Lorsque la commande top fonctionne, les lettres suivantes permettent de changer son fonctionnement :

  • h : affiche l'aide
  • q : quitte la commande top
  • M : tri les processus par utilisation de la mémoire (du plus gourmand au plus sobre)
  • P : tri les processus par utilisation du processeur (du plus gourmand au plus sobre)
  • s : permet de changer la durée de rafraîchissement de top
  • k : permet d'envoyer un signal à un processus

Les processus légers[modifier | modifier le wikicode]

À faire...link={{{link}}}

description des processus légers (light weight process, or thread)

Les Thread ID (TID ou SPID)[modifier | modifier le wikicode]

Les processus légers SPID connus aussi sous le nom de TID (Threads ID) sont les numéros des threads. Explication par l'exemple :

Voir aussi : Processus léger sur Wikipédia



Limiter un processus[modifier | modifier le wikicode]

CPULimit est un utilitaire qui permet de limiter la ressource CPU utilisée par un processus

 apt-get install cpulimit

La syntaxe est la suivante : cpulimit --pid <pid> --limit <limit>

<pid> est le pid du processus cible, et <limit> la limitation effective en pourcentage (maximum 100% sur un simple cœur, 200 pour un double ...)


Exemple :

 cpulimit --pid 2960 --limit 55

Exemple avec le nom de processus (au lieu du pid) :

 cpulimit --exe bigloop --limit 40
À faire...link={{{link}}}

Parler de la commande nice

Conserver un processus en activité[modifier | modifier le wikicode]

Il est possible de laisser tourner un processus lancé depuis la console même sans être connecté. On utilise la fonction nohup qui permet d'ignorer le signal SIGHUP lors de la déconnexion.

 $ nohup application &

La sortie standard est automatiquement redirigée vers nohup.out dans le répertoire courant, sauf si une redirection est spécifiée.

 $ nohup application & > application.log