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
