Le répertoire /etc/init.d
contient les scripts démarrés par
init
quand l'état du niveau d'exécution est changé (voir
init(8)
).
Ces scripts sont référencés par des liens symboliques dans les répertoires
/etc/rcn.d. Quand on change le niveau
d'exécution, init
recherche dans le répertoire
/etc/rcn.d le script à exécuter, où
n est le niveau d'exécution à atteindre.
Le nom des liens ont tous la forme Smmscript ou
Kmmscript où mm correspond à 2 chiffres et
script est le nom du script (il doit être le même que le nom du script
réel dans /etc/init.d). Quand init
change le niveau
d'exécution, d'abord les cibles des liens dont les noms commencent par
K sont exécutées, chacune avec un seul argument stop,
suivi par les scripts préfixés par un S, chacun avec l'argument
start. Les liens K sont responsables de l'arrêt des
services et les liens S du démarrage des services du nouveau
niveau d'exécution.
Par exemple, si nous passons du niveau 2 au niveau 3, init
exécutera d'abord tous les scripts préfixés par K qu'il trouve
dans /etc/rc3.d et ensuite tous les scripts préfixés par
S. Les liens commençant par K amèneront le fichier
référencé à s'exécuter avec l'argument stop, et les liens
S avec un argument start.
Les 2 chiffres mm sont utilisés pour décider dans quel ordre démarrer
et arrêter les choses. Les liens exécutent leurs scripts dans un ordre
croissant. Par exemple les scripts K20 seront exécutés avant les
scripts K30. Cela est utilisé quand certains services doivent
démarrer avant d'autres. Par exemple, le serveur de nom bind
doit
être démarré avant le serveur de news inn
afin qu'inn
puisse positionner ses listes d'accès. Dans ce cas, le script qui démarre
bind
doit avoir un plus petit numéro que le script qui lance
inn
pour démarrer d'abord:
/etc/rc2.d/S17bind /etc/rc2.d/S70inn
Les paquets peuvent et doivent placer les scripts dans /etc/init.d pour démarrer ou arrêter les services au démarrage ou pendant un changement de niveau d'exécution. Ces scripts doivent être nommées /etc/init.d/package, et ils doivent accepter un argument: start signifiant de démarrer le service, ou stop pour arrêter le service. Facultativement, ils peuvent supporter l'argument reload qui provoque le rechargement de la configuration.
Les scripts doivent s'assurer qu'ils se comporteront judicieusement, s'ils sont invoqués avec l'option start quand le service est déjà en action, ou stop s'il ne l'est pas, et qu'ils ne tuent pas fortuitement les process des utilisateurs.
La meilleure façon de réaliser cela est d'utiliser habituellement le programme
start-stop-deamon
.
Ces scripts ne doivent pas échouer de façon obscure quand les fichiers de
configuration persistent alors que le paquet a été enlevé, par défaut
dpkg
laisse les fichiers de configuration dans le système après
que le paquet ait été enlevé. C'est seulement quand il est exécuté avec
l'option --purge, que dpkg
enlèvera les fichiers de
configuration. Cependant, tu dois inclure une instruction de test au début du
script:
test -f programme-exécuté-dans-le-script || exit 0
Un programme update-rc.d
est fourni pour faciliter la maintenance
des paquets dans l'orchestration de la création et de la destruction des liens
symboliques de /etc/rcn.d à partir de leurs
scripts postinst et postrm.
Tu dois utiliser ce script pour réaliser les changements dans /etc/rcn.d et jamais inclure n'importe quels liens symboliques /etc/rcn.d dans l'archive réel.
Par défaut, update-rc.d
démarrera les services dans chacun des
niveaux d'état d'exécution multi-utilisateur (2, 3, 4, et 5) et les arrêtent
dans le niveau halt
(0), niveau mono-utilisateur (1), et le niveau
reboot
(6). L'administrateur système a l'opportunité de
personnaliser les niveaux d'exécution en ajoutant, en déplaçant, ou en enlevant
simplement les liens symboliques dans
/etc/rcn.d.
Pour obtenir le comportement par défaut de ton paquet, mets dans ton script postinst:
update-rc.d package default >/dev/null
et dans ton script postrm:
if [ purge = "$1" ]; then update-rc.d package remove >/dev/nul fi
Ceci utilisera un numéro de séquence par défaut à 20. Si on ne tient pas
compte de quand ou dans quel ordre le script est exécuté, utilise le numéro par
défaut. Sinon, tu dois demander un numéro au mainteneur du paquet
sysvinit
ou dans la mailing list debian-devel, ils
t'aideront à en choisir un.
Pour plus d'information sur l'utilisation d'update-rc.d
, consulte
la page de manuel update-rc.d(8)
.
Il y a un autre répertoire /etc/rc.boot qui contient les scripts qui sont exécutés une fois par démarrage. Ce dispositif est fournie pour l'initialisation de matériels périphériques, nettoyage de fichiers, et ainsi de suite.
Par exemple, le paquet kbd
fournit un script pour l'initialisation
de la configuration clavier, la fonte et le mode de la console.
Les fichiers dans /etc/rc.boot ne doivent pas être liés dans /etc/init.d. Ceux sont des scripts à part entière.
rc.boot ne doit pas être utilisé pour démarrer des processus à but général, et activités similaires. Ceci doit être fait en utilisant la structure rcn.d, ci-dessus, afin que les services puissent être démarrés et arrêtés proprement quand le niveau d'exécution change ou quand la machine doit être éteinte ou rebootée.
Ne pas inclure les liens symboliques de
/etc/rcn.d/* dans l'archive
.deb du système de fichier! Cela amènera des problèmes! Tu dois
les créer avec update-rc.d
, comme ci-dessus.
Ne pas include les liens symboliques de
/etc/rcn.d/* dans la liste de fichiers de
configuration de dpkg
! Cela provoquera des erreurs! Il faut
cependant inclure les scripts /etc/init.d dans les fichiers de
configuration.
Le paquet DNS bind
(serveur de nom) veut être sûr que le serveur
de nom soit démarré dans les niveaux d'exécution multi-utilisateurs, et
proprement arrêté avec le système. Il met un script dans
/etc/init.d nommé bind
. Comme indiqué ci-dessous, le
script interprète l'argument reload, pour envoyer le signal
HUP au serveur de nom (provoquant le rechargement de sa
configuration). De cette façon, l'utilisateur peut taper
/etc/init.d/bind reload pour recharger la configuration du serveur
de nom.
#!/bin/sh # Original version par Robert Leslie <rob@mars.org>, edited by iwj test -x /usr/sbin/named || exit 0 case "$1" in start) test- f /etc/named.boot -a -f /var/name/boot.options || exit 0 start-stop-deamon --start --verbose --exec /usr/sbin/named ;; stop) start-stop-deamon --stop --verbose \ --pidfile /var/run/named.pid --exec /usr/sbin/named ;; reload) start-stop-deamon --stop --signal 1 --verbose \ --pidfile /var/run/named.pid --exec /usr/sbin/named ;; *) echo "Usage: /etc/init.d/bin {start|stop|reload}" >&2 exit 1 ;; esac exit 0
Un autre exemple, sur lequel les scripts de /etc/init.d peuvent se baser, se trouve dans /etc/init.d/skeleton.
Si ce paquet se contente de la configuration par défaut donné par
update-rc.d
, c'est à dire un numéro d'ordre égal à 20 et mise en
oeuvre dans tous les niveaux d'exécution, il est possible d'écrire dans le
script postinst:
update-rc.d bind default >/dev/null
Et dans son script postrm, la suppression du lien quand le paquet est détruit:
if [ purge = "$1" ]; then update-rc.d acct remove >/dev/null fi
Le manuel de programmation de dpkg
15 avril 2002cure@cnam.fr
jacolot@ubolib.univ-brest.fr