User Tools

Site Tools


coursieps:20050304

Les processus

Un processus est un programme en cours d'exécution.

On peut les lister via la commande ps

linux@deblab01:~$ ps
  PID TTY          TIME CMD
 2889 pts/0    00:00:00 bash
 2892 pts/0    00:00:00 ps

Pour afficher tout ce qui tourne:

linux@deblab01:~$ ps -e
  PID TTY          TIME CMD
    1 ?        00:00:00 init
    2 ?        00:00:00 ksoftirqd/0
    3 ?        00:00:00 events/0
    4 ?        00:00:00 khelper
   20 ?        00:00:00 kblockd/0
   48 ?        00:00:00 pdflush
   49 ?        00:00:00 pdflush
   51 ?        00:00:00 aio/0
   50 ?        00:00:00 kswapd0
  193 ?        00:00:00 kseriod
  303 ?        00:00:00 kjournald
  554 ?        00:00:00 kjournald
  809 ?        00:00:00 khubd
 2229 ?        00:00:00 dhclient
 2420 ?        00:00:00 syslogd
 2423 ?        00:00:00 klogd
 2428 ?        00:00:00 cupsd
 2445 ?        00:00:00 dbus-daemon-1
 2477 ?        00:00:00 exim4
 2483 ?        00:00:00 inetd
 2490 ?        00:00:00 sshd
 2515 ?        00:00:00 xfs
 2615 ?        00:00:00 S20xprint
 2616 ?        00:00:00 S20xprint
 2617 ?        00:00:00 Xprt
 2619 ?        00:00:00 S20xprint
 2626 ?        00:00:00 atd
 2629 ?        00:00:00 cron
 2705 ?        00:00:00 wdm
 2706 ?        00:00:00 wdm
 2720 tty1     00:00:00 getty
 2726 tty2     00:00:00 getty
 2727 tty3     00:00:00 getty
 2728 tty4     00:00:00 getty
 2729 tty5     00:00:00 getty
 2730 tty6     00:00:00 getty
 2786 ?        00:00:02 XFree86
 2787 ?        00:00:00 wdm
 2812 ?        00:00:00 x-session-manag
 2856 ?        00:00:00 ssh-agent
 2859 ?        00:00:00 xfce-mcs-manage
 2863 ?        00:00:00 xfwm4
 2864 ?        00:00:00 xftaskbar4
 2865 ?        00:00:00 xfdesktop
 2867 ?        00:00:00 xfce4-panel
 2869 ?        00:00:14 firefox-bin
 2879 ?        00:00:00 gconfd-2
 2888 ?        00:00:00 xterm
 2889 pts/0    00:00:00 bash
 2895 pts/0    00:00:00 ps

Si c'est pas un terminal, c'est soit le noyau (qui démarre le processus init), soit le système. Les process démarrés pas le système et qui restent en arrière-plan sont appellés daemon (disk and execution monitor). Pour voir la charge (processeur, mémoire):

top

Une fois dans top, si on tape u, entrer le nom de l'utilisateur dont on veut voir les processus.

  • h pour help
  • k pour kill

kill est une commande qui permet d'envoyer un signal à un processus

Exercice

Lancer sleep dans un terminal:

sleep 1000

Dans l'autre, on va l'interrompre, d'abord gentiment, puis un peu moins. Pour le tuer:

kill -15 <numéro du processus>

C'est un soft kill: s'il te plaît, éteins-toi Exemple:

kill -15 2901

Donne dans l'autre terminal:

linux@deblab01:~$ sleep 1000
Terminated
kill -9 <numéro du processus>

C'est un hard kill: le process s'éteint quoi qu'il arrive.

kill -9 2984

Donne dans l'autre terminal:

linux@deblab01:~$ sleep 1000
Killed

killall tue les processus dont le nom correspond à celui entré en argurment.

killall sleep

Si on tape le nom d'un programme, celui-ci ne laisse pas la main: je ne peux pas taper quoi que ce soit, le shell est réquisitionné (on dit qu'il tourne en foreground).

Solution: le mettre en background en ajoutant & à la fin.

Au lieu de taper:

mozilla

taper:

mozilla &

Si on ferme le shell, mozilla s'arrête.

C'est parce que le shell est le processus parent du processus mozilla.

Pour les voir:

ps -ef
pstree

Affiche les processus comme un arbre (parents/enfants).

Comment lancer un processus indépendant de son parent? Dans l'exemple, le shell est le parent et sleep est l'enfant.

Il faut précéder la commande de nohup.

nohup sleep&

Fermer le shell, taper:

ps -ef

sleep tourne toujours, il a comme ppid (parent process id) 1, qui est init. init récupère les processus “orphelins”.

nice permet de choisir la priorité du processus qu'on lance. renice permet de changer cette priorité lorsque le processus est en cours d'exécution.

L'initialisation (boot)

Le noyau lance le processus init, qui lui va lancer (initialiser) d'autres processus via des scripts d'initialisation (qui se trouvent dans /etc/init.d/

Il y a 7 runlevels:

  • 0: shutdown
  • 6: reboot
  • 1: mode single user
  • 2-5: mode multi user

Tout est géré dans /etc/inittab Si on regarde ce fichier, on voit que par défaut, Debian démarre au runlevel 2

Pour changer de runlevel: init <runlevel>

A chaque runlevel est associé une série de scripts. en niveau 2, il charge les scripts /etc/rc2.d/S et /etc/rcS.d/

le noyau démarre init. Init démarre les scripts dans /etc/rcS.d/ qui commencent par S (pour start) Init va voir quel est le runlevel Init démarre les scripts correspondant au runlevel

Lorsqu'on entre dans un runlevel, il exécute les fichiers commençant par K (pour kill) dans le répertoire /etc/rcN.d/, puis exécute ceux commençant par S dans le même répertoire.

Il les lance dans l'ordre croissant: S20modutils avant S38dns-clean

En fait, dans répertoires /etc/rcN.d/, ce sont des liens vers les scripts qui sont dans /etc/init.d/

Pour voir comment ça marche, lire le fichier: /etc/init.d/README qui dit d'aller voir le point 9.3 de la Debian policy: http://www.debian.org/doc/debian-policy/ch-opersys.html

Exemple pour comprendre: /etc/init.d/cron

D'abord, il va voir si le logiciel cron existe (est installé)

Ensuite, selon la valeur du premier argument, il va faire une action (case).

Exercice

Faire un script qui quand on le démarre, va faire un fichier /var/log/monscript.log qui fait ce qui suit:

Chaque fois qu'on démarre le script, il doit rajouter une ligne dans le fichier.

date:heure monscript est démarré

Chaque fois qu'on arrête le script, il doit rajouter une ligne dans le fichier.

date:heure monscript est arrêté

C'est plus facile de prendre comme modèle /etc/init.d/cron.

#!/bin/sh
# Start/stop monscript.sh.

test -f /usr/local/sbin/monscript.sh || exit 0

case "$1" in
start)  echo -n "Starting monscript.sh"
        start-stop-daemon --start --quiet --exec /usr/local/sbin/monscript.sh start
        echo "."
        ;;
stop)   echo -n "Stopping monscript.sh"
        start-stop-daemon --stop --quiet --exec /usr/local/sbin/monscript.sh stop
        echo "."
        ;;
restart) echo -n "Restarting monscript.sh"
        start-stop-daemon --stop --retry 5 --quiet --name monscript
        start-stop-daemon --start --quiet --exec /usr/local/sbin/monscript.sh start
        echo "."
        ;;
reload|force-reload) echo -n "Reloading monscript.sh"
        # same as restart
        start-stop-daemon --stop --retry 5 --quiet --name monscript
        start-stop-daemon --start --quiet --exec /usr/local/sbin/monscript.sh start
        echo "."
        ;;
*)      echo "Usage: /etc/init.d/monscript start|stop|restart|reload|force-reload"
        exit 1
        ;;
esac
exit 0
coursieps/20050304.txt · Last modified: 2013/01/30 17:50 (external edit)