Grimoire-
Command
.es

GNU+Linux command memo

Memo_19 : Processus et consoles

D’après l’édition 11 des travaux d’Alain Leaper, 2018-04-10
Licence GPL

1. top : renseignements, en continu, sur l’utilisation du CPU et de la mémoire

$ top
top - 12:27:27 up 1 day, 23:53,  1 user,  load average: 0,53, 0,58, 0,62
Tasks: 234 total,   2 running, 164 sleeping,   2 stopped,  14 zombie
%Cpu(s):  6,7 us,  2,3 sy,  0,2 ni, 90,1 id,  0,0 wa,  0,0 hi,  0,7 si,  0,0 st
KiB Mem :  7843396 total,  2723100 free,  3172712 used,  1947584 buff/cache
KiB Swap:  2097148 total,  1996284 free,   100864 used.  3899980 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
32108 siltaar   20   0 1978064  91532  61028 S   7,3  1,2   0:23.03 vlc
  763 root      20   0  560820 158228 116928 S   5,9  2,0  63:13.44 Xorg

 []

Une version améliorée (graphiques, couleurs) est installable avec le paquet htop. D’autres commandes nouvelles génération sont listées ici.

2. ps : (process status) renseignements sur les processus

$ ps
  PID TTY          TIME CMD
 4897 pts/10   00:00:00 zsh
12022 pts/10   00:00:00 ps

Sans option : affiche uniquement les processus lancés à partir du terminal courant.

Options : c’est une commande qui réagit différemment avec ou sans le tiret (-option peut être différent de option).

En effet les normes POSIX et UNIX exigent que ps -aux affiche tous les processus appartenant à l’utilisateur appelé x, ainsi que tous les processus qui seraient sélectionnés par l’option -a.

$ ps a (1)
1 alors que ps -a permet de sélectionner tous les processus sauf les meneurs de session et les processus non associés à un terminal.

Tous les terminaux, xterm ou consoles, sont concernés (pas seulement le terminal courant).

  PID TTY      STAT   TIME COMMAND
  763 tty7     Ssl+  63:50 /usr/lib/xorg/Xorg :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nol
 1145 tty1     Ss+    0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
 []
19464 pts/6    Ss+    0:01 -zsh
14660 pts/13   Ss     0:01 -zsh
16298 pts/6    S     39:30 /usr/bin/python /usr/bin/pelican --debug --autoreload -r /home/user
16300 pts/6    S      0:32 python -m pelican.server 8001
32666 pts/13   S+     0:31 vim -i NONE content/Memos/memo_19.adoc
$ ps x
  PID TTY      STAT   TIME COMMAND
  856 ?        Ss     0:00 /lib/systemd/systemd --user
  857 ?        S      0:00 (sd-pam)
  866 ?        Ss     0:00 /bin/sh /etc/xdg/xfce4/xinitrc -- /etc/X11/xinit/xserverrc
 []
14660 pts/13   Ss     0:01 -zsh
32666 pts/13   S+     0:48 vim -i NONE content/Memos/memo_19.adoc

Tous les processus (lancés à partir de terminaux ou non) qui appartiennent au même EUID (effective UID) : l’utilisateur courant.

$ ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:03 /sbin/init
    2 ?        S      0:00 [kthreadd]
    3 ?        I<     0:00 [rcu_gp]
    5 ?        I<     0:00 [kworker/0:0H]
 []
  397 ?        Ss     0:03 /lib/systemd/systemd-journald
  407 ?        Ss     0:00 /sbin/lvmetad -f
  417 ?        Ss     0:00 /lib/systemd/systemd-udevd
 []
  856 ?        Ss     0:00 /lib/systemd/systemd --user
  857 ?        S      0:00 (sd-pam)
  866 ?        Ss     0:00 /bin/sh /etc/xdg/xfce4/xinitrc -- /etc/X11/xinit/xserverrc
 []
14660 pts/13   Ss     0:01 -zsh
32666 pts/13   S+     0:44 vim -i NONE content/Memos/memo_19.adoc

Tous les processus sont concernés, sans restriction. C’est l’option que j’utilise par réflex.

$ ps axj
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    0     1     1     1 ?           -1 Ss       0   0:03 /sbin/init
    0     2     0     0 ?           -1 S        0   0:00 [kthreadd]
    2     3     0     0 ?           -1 I<       0   0:00 [rcu_gp]
    2     5     0     0 ?           -1 I<       0   0:00 [kworker/0:0H]
 []
    1   397   397   397 ?           -1 Ss       0   0:03 /lib/systemd/systemd-journald
    1   407   407   407 ?           -1 Ss       0   0:00 /sbin/lvmetad -f
    1   417   417   417 ?           -1 Ss       0   0:00 /lib/systemd/systemd-udevd
 []
    1   856   856   856 ?           -1 Ss    1000   0:00 /lib/systemd/systemd --user
  856   857   856   856 ?           -1 S     1000   0:00 (sd-pam)
  851   866   866   866 ?           -1 Ss    1000   0:00 /bin/sh /etc/xdg/xfce4/xinitrc -- /etc/
 []
 3032 14660 14660 14660 pts/13   32666 Ss    1000   0:01 -zsh
14660 32666 32666 14660 pts/13   32666 S+    1000   0:56 vim -i NONE content/Memos/memo_19.adoc

Donne en plus la filiation. Remarquer le PID 1, à l’origine de tous le autres…​ Son père est le pseudo processus 0.

$ ps l
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0  1000 14660  3032  20   0  52288  6516 -      Ss   pts/13     0:01 -zsh
0  1000 32666 14660  20   0  76444 12352 core_s S+   pts/13     1:03 vim -i NONE content/Memos/m

Elle peut être combinée avec les autres options, et apporte des renseignements complémentaires…​

2.1. Signification de quelques abréviations

PID

(Process ID) numéro d’identification du processus

PPID

(Parent Process ID) numéro d’identification du processus père

TTY

le terminal à l’origine du processus

STAT

(status) première lettre seulement (? si le processus ne vient pas d’un terminal) S (sleeping) : attend quelque chose, ne fait rien. R (running) : est actif. T (stopped) : a reçu un signal SIGSTOP, ne fait plus rien. Z (zombie) : est terminé mais en attente de lecture de son code de sortie (par son père ou celui qui en tient lieu).

3. kill : envoi d’un signal à un processus (pas toujours pour le tuer !)

$ kill -l

Liste tous les signaux possibles pouvant être envoyés à un processus par cette commande. Les sigaux peuvent être identifiés par leur numéro ou par le libellé.

Le processus cible doit au préalable être repéré par son PID (ici 999), voir la commande ps.

$ kill 999 (1)
$ kill -15 999 (2)
$ kill -9 999 (3)
1 Est équivalent à au <2>
2 ou $ kill -SIGTERM 999
3 ou $ kill -SIGKILL 999 : souvent employé quand les autres options ont échoué…

pkill est un raccourci présent dans le paquet coreutils permettant de désigner le processus ciblé directement par son nom. Il est également possible de désigner plusieurs processus d’un coup, s’il correspondent tous au morceau de nom fourni.

$ sleep 500 & (1)
[1] 11513
$ sleep 500 &
[2] 11750
$ pkill sleep
[1]  - 11513 terminated  sleep 500
[2]  + 11750 terminated  sleep 500
1 Le & permet de lancer un processus en arrière plan et de récupérer tout de suite la main dans le terminal. Voir la partie « Mise en attente et reprise » pour plus d’information.

Pour finir, la commande pgrep est elle une combinaison de ps et de grep, pour lister et trouver des processus.

4. nice : permet de modifier la priorité d’exécution d’un processus

Plus un processus est gentil (nice) plus il offre de temps d’exécution aux autres processus.

Cette commande est principalement utilisée sur les processus en arrière plan.

$ nice -n 12 monProgramme &   (1) (2) (3)
1 monProgramme : un programme ou une commande (ls …​)
2 & si on désire lancer en arrière plan (exécution asynchrone)
3 12 (exemple) : un nombre compris entre 1 et 20

Observation par ps avec l’option l :

  • par défaut PRI = 20, NI=0 pour tous les processus ;

  • avec nice -n 12, PRI = 32, NI=12.

C’est à dire une diminution de la priorité (temps de traitement plus long). Seul l’administrateur est autorisé à augmenter la priorité d’un processus, par un nombre négatif.

5. Mise en attente et reprise

$ sleep 500
(1)
[1]  + Interrompu                    sleep 500
1 Ctrl+Z

Pour lister les processus mis en pause :

$ jobs
[1]    Interrompu                    sleep 500

Pour reprendre l’exécution du dernier processus interrompu :

$ fg

Pour reprendre l’exécution du dernier processus, mais en arrière plan :

$ bg
[1]    sleep 500 &
$ jobs
[1]    Tourne                        sleep 500

Cela permet de continuer à faire d’autres choses dans le terminal en question. Le processus se finira naturellement, ou sera tué à la fermeture du terminal qui l’a lancé.

Notez le & qui indique que le processus s’exécute en tâche de fond, il est possible de démarrer directement un processus en arrière plan de la même manière suivante :

$ sleep 500 & (1)
[1] 3687
$ sleep 500 & (2)
[2] 3688
$ jobs -l (3)
[1]  +  3687 Tourne                        sleep 500
[2]  -  3688 Tourne                        sleep 500
1 Lancement d’un processus en tâche de fond
2 Lancement d’un deuxième processus en tâche de fond
3 Affichage de la liste des porcessus an arrière plan dans ce terminal, avec -l leurs PID.

En plus du PID, vous pouvez aussi utiliser directement la numérotation des tâches en arrière plan (le numéro entre crochets), précédé de %, avec kill par exemple :

$ kill -STOP %2
[2]  + Interrompu (Signal)           sleep 500
$ kill -TERM %2
$ jobs -l
[1]  +  3687 Tourne                       sleep 500
[2]     3688 Terminé                      sleep 500

6. Laisser un processus se terminer, même après la fermeture de session

Un processus en cours d’exécution est interrompu par la fin de l’exécution du processus parent (celui à partir duquel il a été lancé). Ainsi, fermer la console tue tous les processus qui ont été lancés depuis cette console. De même, fermer sa session tue tous les processus que l’utilisateur en question avait lancé.

Pour faire survivre un processus à ces évènements, il faut le lancer à l’aide de la commande nohup.

$ nohup sleep 500 &

Vous pouvez alors fermer votre session via la fonction de déconnexion (pour changer d’utilisateur sur la machine par exemple) le processus continuera son exécution et ses sorties seront redirigées vers le fichier nohup.out dans le dossier courant.

Il est également possible d’utiliser la commande disown du paquet shellex pour convertir des processus s’exécutant déjà en tant que tâche de fond, en processus survivants à la déconnexion :

$ $ sleep 1001 &
[1] 3919
$ disown

La session peut maintenant être fermée…

7. tty : identifie le terminal en cours

$ tty
/dev/pts/13

À partir d’un autre terminal, cela permet de rediriger la sortie. Exemple à partir d’un terminal /dev/pts/1

$ echo "bonjour" > /dev/pts/2

Pratique pour les opérations de debugging…​

8. stty : donne la configuration du terminal

$ stty -a
speed 38400 baud; rows 77; columns 96; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany
-imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
-flusho -extproc

Liste les caractéristiques (^ désigne en général la touche Control), ainsi:

  • intr = ^C signifie que Ctrl+C émet le signal SIGINT (signal numéro 2, sur le processus en cours) ;

  • eof = ^D signifie que Ctrl+D émet une fin de fichier (dans une saisie en cours)

9. Ouvrir une session en mode console

C’est parfois pratique pour dépanner…

La combinaison de touches : Ctrl+Alt+F1 (F2…) ; permet d’atteindre une console native depuis un environnement graphique.

En dehors d’un environnement graphique, on peut naviguer entre différentes consoles via : Alt+F1 (F2…).

Au delà des consoles disponible (généralement 6) : Alt+F7 permet de revenir à l’environnement graphique.

9.1. Pour lancer le serveur graphique à partir d’une session en mode console

$ startx
Il peut être intéressant de disposer de la souris en mode console, installer le paquet gpm (et # reboot pour prise en compte).
Pour passer le clavier en azerty : $ sudo loadkeys fr (s’écrit loqdkeys en qwerty). Depuis l’interface graphique et temporairement pour une session : setxkbmap fr (s’écrit setxkb,qp).

10. Arrêt système

La commande shutdown permet d’arrêter le système proprement, sans risquer de perte de fichiers dû à un travail en cours.

Elle date des début d’Unix, lorsque plusieurs utilisateurs se connectaient via des terminaux physiques à une même machine centrale. L’arrêt du système concerne alors tous les utilisateurs connectés. La commande shutdown prévoit donc l’affichage d’un message (que l’on peut ajouté en fin de commande après les autres options) aux utilisateurs connectés pouvant annoncer une date d’arrêt, et donc un arrêt différé (si on ne lui précise pas l’option : -h now).

10.1. Arrêt système immédiat

# shutdown -h now (1)
1 -h pour halt d’ailleurs il existe la commande # halt tout court.

10.2. Redémarrage

# shutdown -r now (1)
1 -r pour reboot d’ailleurs il existe aussi la commande # reboot.