Le système d'exploitation GNU-Linux/Processus
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
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]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
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