Exécuter des scripts au démarrage
Il peut être utile de rajouter des scripts perso au démarrage du serveur, par exemple pour définir les règles de filtrage iptables, nettoyage de logs, etc…
Pour cela il va falloir créer votre script dans le dossier /etc/init.d
Par exemple, on va créer le script daemon.sh :
sudo vi /etc/init.d/daemon.sh
Dans le fichier, ici un script bash, on déclare si nécessaire le shebang à la première ligne :
#!/bin/bash
Dépendances
Déclarer les dépendances permet à Debian de définir l'ordre dans la séquence de démarrage pour démarrer le script.
En documentant les dépendances dans les scripts d'init.d, il devient possible de vérifier l'ordre de démarrage courant, de changer cet ordre et d'exécuter des scripts en parallèle pour accélérer le processus de démarrage.
Pour notre exemple, on va maintenant ajouter ces dépendances en ajoutant le bloc suivant dans le script :
### BEGIN INIT INFO # Provides: daemon # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start daemon at boot time # Description: Enable service provided by daemon. ### END INIT INFO
Paramètres
Provides | En général le nom du script, cela permet d'identifier le script dans la séquence de boot |
Required-Start | Permet d'indiquer les fonctions qui doivent être disponibles pour démarrer le script (voir liste des fonctions virtuelles ci dessous |
Required-Stop | Permet d'indiquer les fonctions utilisées par le script, ces fonctions seront stoppées avant de stopper le script. En général on retrouve les mêmes valeurs que Required-Start |
Should-Start | Permet de définir les fonctions à lancer avant de lancer le script |
Should-Stop | Permet de définir les fonctions à stopper après la fin de l'exécution du script |
Default-Start | Défini les niveaux de démarrage du script |
Default-Stop | Idem, mais pour les niveaux d'arrêt |
Short-Description | Description simple du script sur une ligne |
Description | Description avancée, peut être multi-ligne en ajoutant # suivi d'une tabulation ou deux espaces devant chaque ligne |
Niveaux d'exécution
0 | halt |
1 | single user mode |
2 | multiuser with no network services exported |
3 | normal/full multiuser |
4 | reserved for local use, default is normal/full multiuser |
5 | multiuser with a display manager or equivalent |
6 | reboot |
Fonctions virtuelles
$localfs|Tous les systèmes de fichiers sont montés. Tous les scripts qui écrivent dans /var/ doivent dépendre de cette valeur, sans quoi il doivent aussi dépendre de $remotefs | |
$network | Le réseau de bas niveau (carte réseau, doit comprendre cartes PCMCIA) est lancé |
$named | Service de résolution de nom (DNS) présent et exécuté |
$portmap | Les services fournissant le mapping de port SunRPC/ONCRPC sont lancés |
$remotefs|Tous les systèmes de fichiers sont montés. Dans certains systèmes les dossiers comme /usr sont distants. Si le script nécessite d'avoir monté /usr/, il doit dépendre de $remotefs. Les scripts dépendant de $remotefs n'ont pas besoin de dépendre de $localfs. | |
$syslog | Le système de log est opérationnel |
$time | L'horloge système est définie, utile pour les scripts devant utiliser ntp par exemple |
$all | Fonction pour démarrer un script après tous les autres scripts à la fin de la séquence de démarrage. Cela fonctionne que pour l'ordre de démarrage, pas l'ordre d'arrêt. Il n'est pas possible de dépendre d'un script qui dépend de $all |
La liste complète des paramètres est disponible sur le wiki officiel de Debian
Ajout à la liste de démarrage
Pour finir il faut tout d'abord rendre le script exécutable :
sudo chmod +x /etc/init.d/daemon.sh
On va maintenant déclarer le script dans la séquence de démarrage :
Sous Lenny :
sudo update-rc.d daemon defaults
Sous Squeeze (et au delà) :
sudo insserv daemon
Retirer de la liste de démarrage
Rien de plus simple :
Sous Lenny :
sudo update-rc.d daemon remove
Sous Squeeze (et au delà) :
sudo insserv -r daemon