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