Différences entre versions de « Start stop daemon »
(Page créée avec « = Démarrage du système = Intéressons-nous aux étapes du démarrage d'un système Linux : # Le BIOS ou un chargeur de d'amorçage ([https://fr.wikipedia.org/wiki/Charge... ») |
|||
(15 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 10 : | Ligne 10 : | ||
= Différent niveaux de démarrage = | = Différent niveaux de démarrage = | ||
+ | == Spécification du niveau de démarrage == | ||
+ | Le mécanisme des niveaux de démarrage permet au système Linux de pouvoir démarrer de différentes façons. Cette action est réalisable sans avoir à redémarrer l'ensemble du système. | ||
+ | |||
+ | Le niveau de démarrage par défaut est définit dans le fichier ''/etc/inittab'' avec une ligne qui ressemble à cela : | ||
+ | <pre> | ||
+ | id:3:initdefault: | ||
+ | </pre> | ||
+ | Dans cet exemple, le niveau de démarrage du système est ''3''. | ||
+ | == Descriptions des niveaux de démarrage == | ||
+ | Les niveaux de démarrage vont de ''0'' à ''6'' et ont la signification suivante : | ||
+ | * ''0'' : éteint le système. Passer dans ce niveau arrêtera tous les sous-systèmes proprement avant l'arrêt de la machine ; | ||
+ | * ''1'' : mode mono-utilisateur. Seul les sous-systèmes vitaux sont initialisés car ce mode sert principalement pour la maintenance. Ce mode offre directement un shell sans demander d'authentification à l'utilisateur ; | ||
+ | * ''2'' : niveau historique (plus utilisé) comme le ''3'' mais sans NFS ; | ||
+ | * ''3'' : niveau utilisé pour des système de production sans interface graphique. C'est ce niveau qui nous intéresse pour notre sous-système ; | ||
+ | * ''4'' : pas utilisé ; | ||
+ | * ''5'' : comme le niveau ''3'' mais avec l'interface graphique en plus. Niveau utilisé pour les stations de travail. | ||
+ | * ''6'' : redémarre la machine. | ||
+ | {|style="width:650px" align="center" | ||
+ | | | ||
+ | [[Fichier:Warning manual.jpg|centré|300px]] | ||
+ | |valign="top"| | ||
+ | Pour des raisons évidentes, les niveaux de démarrage ''0'' est ''6'' '''ne sont pas''' à inscrire dans le fichier ''/etc/inittab'' ! | ||
+ | |} | ||
+ | |||
+ | Il est possible de : | ||
+ | * voir le niveau de démarrage courant grâce à la commande ''runlevel'' ; | ||
+ | * de changer de niveau de démarrage grâce à la commande ''telinit'' ; | ||
+ | |||
+ | Dans l'exemple ci-dessous, on affiche le niveau de démarrage courant, on passe au niveau ''5'' puis on affiche la transition. | ||
+ | <pre> | ||
+ | # runlevel | ||
+ | N 3 | ||
+ | # telinit 5 | ||
+ | # runlevel | ||
+ | 3 5 | ||
+ | </pre> | ||
= Les sous-systèmes = | = Les sous-systèmes = | ||
+ | On peut prendre comme exemple de sous-système toutes les parties serveur des programmes que l'on utilise : un serveur web (''httpd''), un serveur de base de données (''mysqld''), les services réseaux (''network''), un serveur DHCP (''dhcpd''), etc... | ||
+ | En revanche, les programmes utilisateurs ne peuvent être considéré comme des sous-systèmes comme, par, exemple, l'éditeurs de texte (''vi''). | ||
+ | |||
+ | Linux fournit un moyen modulaire et élégant de gérer le démarrage des sous-systèmes. Une notion très importante à laquelle il faut penser est l'interdépendance. Par exemple, il est complétement fou de vouloir démarrer un serveur web avant que le sous-système réseau n'ai activé l'adaptateur réseau. | ||
+ | |||
+ | Le sous-systèmes sont répartis sous l'arborescence ''/etc/init.d'' et ''/etc/rc.d/rcX.d'' (X correspond au niveau de démarrage) | ||
+ | |||
+ | ==/etc/init.d== | ||
+ | |||
+ | Tous les sous-systèmes installés place dans se répertoire leur programme de contrôle, qui est un script qui suit un standard décrit plus bas. Voici un exemple de ce qu'on peut y trouver : | ||
+ | <pre> | ||
+ | # ll /etc/init.d/ | ||
+ | total 208 | ||
+ | -rwxr-xr-x 1 root root 3580 11 mai 2016 auditd | ||
+ | -r-xr-xr-x 1 root root 1343 23 août 2016 blk-availability | ||
+ | -rwxr-xr-x 1 root root 2826 23 août 2016 crond | ||
+ | -rwxr-xr-x 1 root root 3245 9 juil. 2013 firstboot | ||
+ | -rw-r--r-- 1 root root 25419 12 avril 2016 functions | ||
+ | -rwxr-xr-x 1 root root 1801 15 oct. 2014 haldaemon | ||
+ | -rwxr-xr-x 1 root root 5985 12 avril 2016 halt | ||
+ | -rwxr-xr-x 1 root root 2001 19 nov. 00:49 htcacheclean | ||
+ | -rwxr-xr-x 1 root root 3488 19 nov. 00:49 httpd | ||
+ | -rwxr-xr-x 1 root root 11169 24 juil. 2015 ip6tables | ||
+ | -rwxr-xr-x 1 root root 11048 24 juil. 2015 iptables | ||
+ | -rwxr-xr-x 1 root root 4535 9 août 2016 iscsi | ||
+ | -rwxr-xr-x 1 root root 3990 9 août 2016 iscsid | ||
+ | -rwxr-xr-x 1 root root 652 12 avril 2016 killall | ||
+ | -r-xr-xr-x 1 root root 2137 23 août 2016 lvm2-lvmetad | ||
+ | -r-xr-xr-x 1 root root 3045 23 août 2016 lvm2-monitor | ||
+ | -rwxr-xr-x 1 root root 2571 21 juin 2016 mdmonitor | ||
+ | -rwxr-xr-x 1 root root 2200 22 avril 2015 messagebus | ||
+ | -rwxr-xr-x 1 root root 2523 11 mai 2016 multipathd | ||
+ | -rwxr-xr-x 1 root root 7026 11 mai 2016 mysqld | ||
+ | -rwxr-xr-x 1 root root 2989 12 avril 2016 netconsole | ||
+ | -rwxr-xr-x 1 root root 5309 12 avril 2016 netfs | ||
+ | -rwxr-xr-x 1 root root 6406 12 avril 2016 network | ||
+ | -rwxr-xr-x 1 root root 1923 3 mai 2016 ntpd | ||
+ | -rwxr-xr-x 1 root root 2043 3 mai 2016 ntpdate | ||
+ | -rwxr-xr-x 1 root root 3912 10 nov. 2015 postfix | ||
+ | -rwxr-xr-x 1 root root 1513 13 nov. 2015 rdisc | ||
+ | -rwxr-xr-x 1 root root 1822 18 nov. 16:30 restorecond | ||
+ | -rwxr-xr-x 1 root root 2011 10 déc. 2014 rsyslog | ||
+ | -rwxr-xr-x 1 root root 1698 18 nov. 16:30 sandbox | ||
+ | -rwxr-xr-x 1 root root 2056 27 févr. 2015 saslauthd | ||
+ | -rwxr-xr-x 1 root root 647 12 avril 2016 single | ||
+ | -rwxr-xr-x 1 root root 2472 11 mai 2016 spice-vdagentd | ||
+ | -rwxr-xr-x 1 root root 4621 12 mai 2016 sshd | ||
+ | -rwxr-xr-x 1 root root 2294 6 sept. 2016 udev-post | ||
+ | -rwxr-xr-x. 1 root root 1674 21 févr. 2013 wdaemon | ||
+ | </pre> | ||
+ | |||
+ | ==/etc/rcX.d/== | ||
+ | les sous-systèmes sont démarrés et arrêtés au différent niveau de démarrage grâce à des liens symboliques placé dans les différents répertoires ''/etc/rcX.d'' (ici le niveau ''3'') : | ||
+ | <pre> | ||
+ | # ll /etc/rc3.d/ | ||
+ | total 0 | ||
+ | lrwxrwxrwx. 1 root root 17 17 déc. 2015 K05wdaemon -> ../init.d/wdaemon | ||
+ | lrwxrwxrwx. 1 root root 19 17 déc. 2015 K10saslauthd -> ../init.d/saslauthd | ||
+ | lrwxrwxrwx. 1 root root 22 17 déc. 2015 K15htcacheclean -> ../init.d/htcacheclean | ||
+ | lrwxrwxrwx. 1 root root 15 17 déc. 2015 K15httpd -> ../init.d/httpd | ||
+ | lrwxrwxrwx. 1 root root 18 31 mai 2016 K15svnserve -> ../init.d/svnserve | ||
+ | lrwxrwxrwx. 1 root root 24 17 déc. 2015 K30spice-vdagentd -> ../init.d/spice-vdagentd | ||
+ | lrwxrwxrwx. 1 root root 20 17 déc. 2015 K50netconsole -> ../init.d/netconsole | ||
+ | lrwxrwxrwx. 1 root root 17 17 déc. 2015 K75ntpdate -> ../init.d/ntpdate | ||
+ | lrwxrwxrwx. 1 root root 20 17 déc. 2015 K87multipathd -> ../init.d/multipathd | ||
+ | lrwxrwxrwx. 1 root root 21 17 déc. 2015 K87restorecond -> ../init.d/restorecond | ||
+ | lrwxrwxrwx. 1 root root 15 17 déc. 2015 K89rdisc -> ../init.d/rdisc | ||
+ | lrwxrwxrwx 1 root root 19 25 juil. 2016 K95firstboot -> ../init.d/firstboot | ||
+ | lrwxrwxrwx. 1 root root 22 17 déc. 2015 S02lvm2-monitor -> ../init.d/lvm2-monitor | ||
+ | lrwxrwxrwx. 1 root root 16 17 déc. 2015 S07iscsid -> ../init.d/iscsid | ||
+ | lrwxrwxrwx. 1 root root 19 17 déc. 2015 S08ip6tables -> ../init.d/ip6tables | ||
+ | lrwxrwxrwx. 1 root root 18 17 déc. 2015 S08iptables -> ../init.d/iptables | ||
+ | lrwxrwxrwx. 1 root root 17 17 déc. 2015 S10network -> ../init.d/network | ||
+ | lrwxrwxrwx. 1 root root 16 17 déc. 2015 S11auditd -> ../init.d/auditd | ||
+ | lrwxrwxrwx. 1 root root 17 17 déc. 2015 S12rsyslog -> ../init.d/rsyslog | ||
+ | lrwxrwxrwx 1 root root 15 25 juil. 2016 S13iscsi -> ../init.d/iscsi | ||
+ | lrwxrwxrwx. 1 root root 19 17 déc. 2015 S15mdmonitor -> ../init.d/mdmonitor | ||
+ | lrwxrwxrwx 1 root root 20 12 oct. 21:05 S22messagebus -> ../init.d/messagebus | ||
+ | lrwxrwxrwx. 1 root root 26 17 déc. 2015 S25blk-availability -> ../init.d/blk-availability | ||
+ | lrwxrwxrwx. 1 root root 15 17 déc. 2015 S25netfs -> ../init.d/netfs | ||
+ | lrwxrwxrwx. 1 root root 19 17 déc. 2015 S26haldaemon -> ../init.d/haldaemon | ||
+ | lrwxrwxrwx. 1 root root 19 17 déc. 2015 S26udev-post -> ../init.d/udev-post | ||
+ | lrwxrwxrwx. 1 root root 14 17 déc. 2015 S55sshd -> ../init.d/sshd | ||
+ | lrwxrwxrwx 1 root root 14 17 mars 12:05 S58ntpd -> ../init.d/ntpd | ||
+ | lrwxrwxrwx. 1 root root 16 3 juin 2016 S64mysqld -> ../init.d/mysqld | ||
+ | lrwxrwxrwx. 1 root root 17 17 déc. 2015 S80postfix -> ../init.d/postfix | ||
+ | lrwxrwxrwx 1 root root 15 18 mars 12:02 S85httpd -> ../init.d/httpd | ||
+ | lrwxrwxrwx. 1 root root 15 17 déc. 2015 S90crond -> ../init.d/crond | ||
+ | lrwxrwxrwx 1 root root 11 12 oct. 21:05 S99local -> ../rc.local | ||
+ | </pre> | ||
+ | |||
+ | Les liens pointent toujours vers le fichier de contrôle présent dans le répertoire ''/etc/init.d'' et leurs noms sont normés de la sorte : | ||
+ | * la première lettre indique s'il faut démarrer (''S'') ou arrêter le sous-système (''K'') ; | ||
+ | * les deux chiffres qui suivent correspondent à l'ordre de démarrage ou d'arrêt. ''S10network'' signifie que le sous-système ''network'' sera démarré en 10° position, avant le sous-système ''httpd'' (''S85httpd '') ; | ||
+ | * la fin correspond au nom du sous-système concerné. | ||
+ | |||
+ | == Démarrage / arrêt automatique == | ||
+ | Pour activé ou désactivé un sous-système, il suffit soit de créer les liens symboliques précédent dans les bon sous-répertoire ou, plus simple, d'utiliser la commande ''chkconfig''. Ainsi : | ||
+ | <pre> | ||
+ | # chkconfig httpd on | ||
+ | </pre> | ||
+ | Activera le sous-système au démarrage alors que : | ||
+ | <pre> | ||
+ | # chkconfig httpd off | ||
+ | </pre> | ||
+ | le désactivera. | ||
= Transformer un programme en sous-système = | = Transformer un programme en sous-système = | ||
+ | Les fichiers de votre sous-système sont répartis à travers le système de fichier mais, il faut fournir une interface simple à l'utilisateur qui lui permette de démarrer et arrêter le sous-système. | ||
+ | == Script pour sous-système == | ||
+ | L'architecture en sous-système fournit par ''System V'' permet d'accomplir cela, la seule chose à faire et de créer un script dans ''/etc/init.d'' qui suit quelques préceptes. | ||
+ | |||
+ | Ci-dessous un exemple de script, ''/etc/init.d/monsystem'', découpé en plusieurs parties commentées : | ||
+ | {|style="border-collapse:collapse" | ||
+ | |- | ||
+ | || | ||
+ | <source lang="bash"> | ||
+ | #!/bin/sh | ||
+ | # | ||
+ | # /etc/init.d/monsystem | ||
+ | # Fichier sous-système pour le serveur "monsystem" | ||
+ | # | ||
+ | # chkconfig: 2345 95 05 | ||
+ | # description: démon monsystem | ||
+ | # | ||
+ | # processname: monsystem | ||
+ | # config: /etc/monsystem/monsystem.conf | ||
+ | # config: /etc/monsystem/monsystem | ||
+ | # pidfile: /var/run/monsystem.pid | ||
+ | </source> | ||
+ | |style="width:45%"| | ||
+ | Même si ces lignes sont commentées, elle sont lues par la commande ''chkconfig'' et doivent être présente ! | ||
+ | On peut remarquer celle spécifiant les niveaux de démarrage. | ||
+ | Le sous-système est piloté aux niveaux ''2'', ''3'', ''4'', ''5'', activé en position ''95'' (une des dernières) et arrêter en position ''05'' (une des premières). | ||
+ | |- | ||
+ | || | ||
+ | <source lang="bash"> | ||
+ | # fichier source des fonctions | ||
+ | . /etc/rc.d/init.d/functions | ||
+ | |||
+ | # chargement, le cas échéant, des paramètres du dossier sysconfig | ||
+ | [ -f /etc/sysconfig/monsystem ] && . /etc/sysconfig/monsystem | ||
+ | </source> | ||
+ | |style="width:45%"| | ||
+ | En plus de la configuration du démon, le script peut lui aussi avoir sa propre configuration. L’emplacement ''classique'' pour cela est dans le répertoire ''/etc/sysconfig'' et dans cet exemple le fichier s'appelle ''monsystem''. | ||
+ | |- | ||
+ | || | ||
+ | <source lang="bash"> | ||
+ | RETVAL=0 | ||
+ | prog="monsystem" | ||
+ | PIDFILE="/var/run/monsystem.pid" | ||
+ | |||
+ | start() { | ||
+ | echo -n $"Starting $prog:" | ||
+ | |||
+ | # Instructions de démarrage du sous-système | ||
+ | |||
+ | RETVAL=$? | ||
+ | [ "$RETVAL" = 0 ] && touch /var/lock/subsys/$prog | ||
+ | showResult | ||
+ | } | ||
+ | |||
+ | stop() { | ||
+ | echo -n $"Stopping $prog:" | ||
+ | # Instructions d'arrêt du sous-système | ||
+ | # eg. kill $(cat ${PIDFILE}) &> /dev/null | ||
+ | RETVAL=$? | ||
+ | [ "$RETVAL" = 0 ] && rm -f /var/lock/subsys/$prog ${PIDFILE} | ||
+ | showResult | ||
+ | } | ||
+ | |||
+ | reload() { | ||
+ | echo -n $"Reloading $prog:" | ||
+ | # Instructions de rechargement du sous-système | ||
+ | # eg. kill -1 $(cat ${PIDFILE}) | ||
+ | RETVAL=$? | ||
+ | showResult | ||
+ | } | ||
+ | |||
+ | showResult() { | ||
+ | # On affiche le retour du script : [ OK ] ou [ ÉCHOUÉ ] | ||
+ | [ $RETVAL -eq 0 ] && success || failure | ||
+ | echo | ||
+ | } | ||
+ | </source> | ||
+ | |style="width:45%"| | ||
+ | Le script peut contenir beaucoup de méthodes ou fonction, mais il obligatoire qu'il possède au minimum les méthodes ''start'' et ''stop'' qui sont appelées au démarrage et à l'arrêt du démon. Les autres méthodes peuvent être appelées de l'invite de commande. | ||
+ | |- | ||
+ | || | ||
+ | <source lang="bash"> | ||
+ | case "$1" in | ||
+ | start) | ||
+ | start | ||
+ | ;; | ||
+ | stop) | ||
+ | stop | ||
+ | ;; | ||
+ | restart) | ||
+ | stop | ||
+ | start | ||
+ | ;; | ||
+ | reload) | ||
+ | reload | ||
+ | ;; | ||
+ | condrestart) | ||
+ | if [ -f /var/lock/subsys/$prog ] ; then | ||
+ | stop | ||
+ | # On évite les accès concurent en patientant | ||
+ | # avant de démarrer à nouveau le sous-système | ||
+ | sleep 3 | ||
+ | start | ||
+ | fi | ||
+ | ;; | ||
+ | status) | ||
+ | status $prog | ||
+ | RETVAL=$? | ||
+ | ;; | ||
+ | *) | ||
+ | echo $"Usage: $0 {start|stop|restart|reload|condrestart|status}" | ||
+ | RETVAL=1 | ||
+ | esac | ||
+ | exit $RETVAL | ||
+ | </source> | ||
+ | |style="width:45%"| | ||
+ | Partie contenant le case qui permet d'effectuer l'action demandée par l'utilisateur. | ||
+ | |} | ||
+ | Il faudra que le programme en question alimente le fichier ''PID'' avec le numéro de processus pour que cela fonctionne... | ||
+ | |||
+ | N'hésitez pas à vous inspirer de cette [[Php_daemon|exemple]] de démon en PHP. | ||
+ | |||
+ | == Utilisation == | ||
+ | Pour utiliser le sous-système, rien de plus simple. Cela ce fait grâce à la commandes ''service'' : | ||
+ | <pre> | ||
+ | # service monsystem start | ||
+ | Starting monsystem: [ OK ] | ||
+ | # service monsystem status | ||
+ | monsystem (pid 3196) en cours d'exécution... | ||
+ | # service monsystem stop | ||
+ | Stopping monsystem: [ OK ] | ||
+ | # service monsystem status | ||
+ | monsystem est arrêté | ||
+ | # service monsystem restart | ||
+ | Stopping monsystem: [ÉCHOUÉ] | ||
+ | Starting monsystem: [ OK ] | ||
+ | </pre> | ||
+ | |||
+ | Pour enregistrer le service au démarrage : | ||
+ | <pre> | ||
+ | # chkconfig monsystem on | ||
+ | # chkconfig --list monsystem | ||
+ | monsystem 0:arrêt 1:arrêt 2:marche 3:marche 4:marche 5:marche 6:arrêt | ||
+ | </pre> |
Version actuelle datée du 27 décembre 2017 à 09:36
Démarrage du système
Intéressons-nous aux étapes du démarrage d'un système Linux :
- Le BIOS ou un chargeur de d'amorçage (bootloader) comme lilo, zlilo ou grub, charge le noyau Linux (vmlinuz) du disque dur en mémoire avec certain paramètres définis dans le fichier de configuration du chargeur d'amorce ;
- Depuis la mémoire vive, le noyau amorce son démarrage par la détection de périphériques vitaux comme des disques, partitions, etc... ;
- La dernière étape entreprise par le noyau et le montage de la partition racine / (root) qui doit obligatoirement contenir les dossiers /etc, /sbin, /bin et /lib ;
- Une fois le décors planté, init est appelé (/sbin/init) et le noyau lui passe la main ;
- Le programme init va lire son fichier de configuration (/etc/inittab) dans lequel est spécifié le niveau de démarrage ou runlevel, ainsi que certain scripts shell à exécuter ;
- Ces scripts vont poursuivre le démarrage du système en montant le système de fichier tel que décrit dans /etc/fstab, activer la mémoire virtuelle (swap), etc... ;
- La dernière étape, celle qui va nous intéresser, consiste à exécuter les scripts présent dans les répertoires /etc/rc.d/rc et qui démarre les programmes en sous-systèmes en fonction de l’arborescence /etc/rc.d. Le nom rc signifie d'ailleurs run commands.
Différent niveaux de démarrage
Spécification du niveau de démarrage
Le mécanisme des niveaux de démarrage permet au système Linux de pouvoir démarrer de différentes façons. Cette action est réalisable sans avoir à redémarrer l'ensemble du système.
Le niveau de démarrage par défaut est définit dans le fichier /etc/inittab avec une ligne qui ressemble à cela :
id:3:initdefault:
Dans cet exemple, le niveau de démarrage du système est 3.
Descriptions des niveaux de démarrage
Les niveaux de démarrage vont de 0 à 6 et ont la signification suivante :
- 0 : éteint le système. Passer dans ce niveau arrêtera tous les sous-systèmes proprement avant l'arrêt de la machine ;
- 1 : mode mono-utilisateur. Seul les sous-systèmes vitaux sont initialisés car ce mode sert principalement pour la maintenance. Ce mode offre directement un shell sans demander d'authentification à l'utilisateur ;
- 2 : niveau historique (plus utilisé) comme le 3 mais sans NFS ;
- 3 : niveau utilisé pour des système de production sans interface graphique. C'est ce niveau qui nous intéresse pour notre sous-système ;
- 4 : pas utilisé ;
- 5 : comme le niveau 3 mais avec l'interface graphique en plus. Niveau utilisé pour les stations de travail.
- 6 : redémarre la machine.
Pour des raisons évidentes, les niveaux de démarrage 0 est 6 ne sont pas à inscrire dans le fichier /etc/inittab ! |
Il est possible de :
- voir le niveau de démarrage courant grâce à la commande runlevel ;
- de changer de niveau de démarrage grâce à la commande telinit ;
Dans l'exemple ci-dessous, on affiche le niveau de démarrage courant, on passe au niveau 5 puis on affiche la transition.
# runlevel N 3 # telinit 5 # runlevel 3 5
Les sous-systèmes
On peut prendre comme exemple de sous-système toutes les parties serveur des programmes que l'on utilise : un serveur web (httpd), un serveur de base de données (mysqld), les services réseaux (network), un serveur DHCP (dhcpd), etc... En revanche, les programmes utilisateurs ne peuvent être considéré comme des sous-systèmes comme, par, exemple, l'éditeurs de texte (vi).
Linux fournit un moyen modulaire et élégant de gérer le démarrage des sous-systèmes. Une notion très importante à laquelle il faut penser est l'interdépendance. Par exemple, il est complétement fou de vouloir démarrer un serveur web avant que le sous-système réseau n'ai activé l'adaptateur réseau.
Le sous-systèmes sont répartis sous l'arborescence /etc/init.d et /etc/rc.d/rcX.d (X correspond au niveau de démarrage)
/etc/init.d
Tous les sous-systèmes installés place dans se répertoire leur programme de contrôle, qui est un script qui suit un standard décrit plus bas. Voici un exemple de ce qu'on peut y trouver :
# ll /etc/init.d/ total 208 -rwxr-xr-x 1 root root 3580 11 mai 2016 auditd -r-xr-xr-x 1 root root 1343 23 août 2016 blk-availability -rwxr-xr-x 1 root root 2826 23 août 2016 crond -rwxr-xr-x 1 root root 3245 9 juil. 2013 firstboot -rw-r--r-- 1 root root 25419 12 avril 2016 functions -rwxr-xr-x 1 root root 1801 15 oct. 2014 haldaemon -rwxr-xr-x 1 root root 5985 12 avril 2016 halt -rwxr-xr-x 1 root root 2001 19 nov. 00:49 htcacheclean -rwxr-xr-x 1 root root 3488 19 nov. 00:49 httpd -rwxr-xr-x 1 root root 11169 24 juil. 2015 ip6tables -rwxr-xr-x 1 root root 11048 24 juil. 2015 iptables -rwxr-xr-x 1 root root 4535 9 août 2016 iscsi -rwxr-xr-x 1 root root 3990 9 août 2016 iscsid -rwxr-xr-x 1 root root 652 12 avril 2016 killall -r-xr-xr-x 1 root root 2137 23 août 2016 lvm2-lvmetad -r-xr-xr-x 1 root root 3045 23 août 2016 lvm2-monitor -rwxr-xr-x 1 root root 2571 21 juin 2016 mdmonitor -rwxr-xr-x 1 root root 2200 22 avril 2015 messagebus -rwxr-xr-x 1 root root 2523 11 mai 2016 multipathd -rwxr-xr-x 1 root root 7026 11 mai 2016 mysqld -rwxr-xr-x 1 root root 2989 12 avril 2016 netconsole -rwxr-xr-x 1 root root 5309 12 avril 2016 netfs -rwxr-xr-x 1 root root 6406 12 avril 2016 network -rwxr-xr-x 1 root root 1923 3 mai 2016 ntpd -rwxr-xr-x 1 root root 2043 3 mai 2016 ntpdate -rwxr-xr-x 1 root root 3912 10 nov. 2015 postfix -rwxr-xr-x 1 root root 1513 13 nov. 2015 rdisc -rwxr-xr-x 1 root root 1822 18 nov. 16:30 restorecond -rwxr-xr-x 1 root root 2011 10 déc. 2014 rsyslog -rwxr-xr-x 1 root root 1698 18 nov. 16:30 sandbox -rwxr-xr-x 1 root root 2056 27 févr. 2015 saslauthd -rwxr-xr-x 1 root root 647 12 avril 2016 single -rwxr-xr-x 1 root root 2472 11 mai 2016 spice-vdagentd -rwxr-xr-x 1 root root 4621 12 mai 2016 sshd -rwxr-xr-x 1 root root 2294 6 sept. 2016 udev-post -rwxr-xr-x. 1 root root 1674 21 févr. 2013 wdaemon
/etc/rcX.d/
les sous-systèmes sont démarrés et arrêtés au différent niveau de démarrage grâce à des liens symboliques placé dans les différents répertoires /etc/rcX.d (ici le niveau 3) :
# ll /etc/rc3.d/ total 0 lrwxrwxrwx. 1 root root 17 17 déc. 2015 K05wdaemon -> ../init.d/wdaemon lrwxrwxrwx. 1 root root 19 17 déc. 2015 K10saslauthd -> ../init.d/saslauthd lrwxrwxrwx. 1 root root 22 17 déc. 2015 K15htcacheclean -> ../init.d/htcacheclean lrwxrwxrwx. 1 root root 15 17 déc. 2015 K15httpd -> ../init.d/httpd lrwxrwxrwx. 1 root root 18 31 mai 2016 K15svnserve -> ../init.d/svnserve lrwxrwxrwx. 1 root root 24 17 déc. 2015 K30spice-vdagentd -> ../init.d/spice-vdagentd lrwxrwxrwx. 1 root root 20 17 déc. 2015 K50netconsole -> ../init.d/netconsole lrwxrwxrwx. 1 root root 17 17 déc. 2015 K75ntpdate -> ../init.d/ntpdate lrwxrwxrwx. 1 root root 20 17 déc. 2015 K87multipathd -> ../init.d/multipathd lrwxrwxrwx. 1 root root 21 17 déc. 2015 K87restorecond -> ../init.d/restorecond lrwxrwxrwx. 1 root root 15 17 déc. 2015 K89rdisc -> ../init.d/rdisc lrwxrwxrwx 1 root root 19 25 juil. 2016 K95firstboot -> ../init.d/firstboot lrwxrwxrwx. 1 root root 22 17 déc. 2015 S02lvm2-monitor -> ../init.d/lvm2-monitor lrwxrwxrwx. 1 root root 16 17 déc. 2015 S07iscsid -> ../init.d/iscsid lrwxrwxrwx. 1 root root 19 17 déc. 2015 S08ip6tables -> ../init.d/ip6tables lrwxrwxrwx. 1 root root 18 17 déc. 2015 S08iptables -> ../init.d/iptables lrwxrwxrwx. 1 root root 17 17 déc. 2015 S10network -> ../init.d/network lrwxrwxrwx. 1 root root 16 17 déc. 2015 S11auditd -> ../init.d/auditd lrwxrwxrwx. 1 root root 17 17 déc. 2015 S12rsyslog -> ../init.d/rsyslog lrwxrwxrwx 1 root root 15 25 juil. 2016 S13iscsi -> ../init.d/iscsi lrwxrwxrwx. 1 root root 19 17 déc. 2015 S15mdmonitor -> ../init.d/mdmonitor lrwxrwxrwx 1 root root 20 12 oct. 21:05 S22messagebus -> ../init.d/messagebus lrwxrwxrwx. 1 root root 26 17 déc. 2015 S25blk-availability -> ../init.d/blk-availability lrwxrwxrwx. 1 root root 15 17 déc. 2015 S25netfs -> ../init.d/netfs lrwxrwxrwx. 1 root root 19 17 déc. 2015 S26haldaemon -> ../init.d/haldaemon lrwxrwxrwx. 1 root root 19 17 déc. 2015 S26udev-post -> ../init.d/udev-post lrwxrwxrwx. 1 root root 14 17 déc. 2015 S55sshd -> ../init.d/sshd lrwxrwxrwx 1 root root 14 17 mars 12:05 S58ntpd -> ../init.d/ntpd lrwxrwxrwx. 1 root root 16 3 juin 2016 S64mysqld -> ../init.d/mysqld lrwxrwxrwx. 1 root root 17 17 déc. 2015 S80postfix -> ../init.d/postfix lrwxrwxrwx 1 root root 15 18 mars 12:02 S85httpd -> ../init.d/httpd lrwxrwxrwx. 1 root root 15 17 déc. 2015 S90crond -> ../init.d/crond lrwxrwxrwx 1 root root 11 12 oct. 21:05 S99local -> ../rc.local
Les liens pointent toujours vers le fichier de contrôle présent dans le répertoire /etc/init.d et leurs noms sont normés de la sorte :
- la première lettre indique s'il faut démarrer (S) ou arrêter le sous-système (K) ;
- les deux chiffres qui suivent correspondent à l'ordre de démarrage ou d'arrêt. S10network signifie que le sous-système network sera démarré en 10° position, avant le sous-système httpd (S85httpd ) ;
- la fin correspond au nom du sous-système concerné.
Démarrage / arrêt automatique
Pour activé ou désactivé un sous-système, il suffit soit de créer les liens symboliques précédent dans les bon sous-répertoire ou, plus simple, d'utiliser la commande chkconfig. Ainsi :
# chkconfig httpd on
Activera le sous-système au démarrage alors que :
# chkconfig httpd off
le désactivera.
Transformer un programme en sous-système
Les fichiers de votre sous-système sont répartis à travers le système de fichier mais, il faut fournir une interface simple à l'utilisateur qui lui permette de démarrer et arrêter le sous-système.
Script pour sous-système
L'architecture en sous-système fournit par System V permet d'accomplir cela, la seule chose à faire et de créer un script dans /etc/init.d qui suit quelques préceptes.
Ci-dessous un exemple de script, /etc/init.d/monsystem, découpé en plusieurs parties commentées :
#!/bin/sh
#
# /etc/init.d/monsystem
# Fichier sous-système pour le serveur "monsystem"
#
# chkconfig: 2345 95 05
# description: démon monsystem
#
# processname: monsystem
# config: /etc/monsystem/monsystem.conf
# config: /etc/monsystem/monsystem
# pidfile: /var/run/monsystem.pid
|
Même si ces lignes sont commentées, elle sont lues par la commande chkconfig et doivent être présente ! On peut remarquer celle spécifiant les niveaux de démarrage. Le sous-système est piloté aux niveaux 2, 3, 4, 5, activé en position 95 (une des dernières) et arrêter en position 05 (une des premières). |
# fichier source des fonctions
. /etc/rc.d/init.d/functions
# chargement, le cas échéant, des paramètres du dossier sysconfig
[ -f /etc/sysconfig/monsystem ] && . /etc/sysconfig/monsystem
|
En plus de la configuration du démon, le script peut lui aussi avoir sa propre configuration. L’emplacement classique pour cela est dans le répertoire /etc/sysconfig et dans cet exemple le fichier s'appelle monsystem. |
RETVAL=0
prog="monsystem"
PIDFILE="/var/run/monsystem.pid"
start() {
echo -n $"Starting $prog:"
# Instructions de démarrage du sous-système
RETVAL=$?
[ "$RETVAL" = 0 ] && touch /var/lock/subsys/$prog
showResult
}
stop() {
echo -n $"Stopping $prog:"
# Instructions d'arrêt du sous-système
# eg. kill $(cat ${PIDFILE}) &> /dev/null
RETVAL=$?
[ "$RETVAL" = 0 ] && rm -f /var/lock/subsys/$prog ${PIDFILE}
showResult
}
reload() {
echo -n $"Reloading $prog:"
# Instructions de rechargement du sous-système
# eg. kill -1 $(cat ${PIDFILE})
RETVAL=$?
showResult
}
showResult() {
# On affiche le retour du script : [ OK ] ou [ ÉCHOUÉ ]
[ $RETVAL -eq 0 ] && success || failure
echo
}
|
Le script peut contenir beaucoup de méthodes ou fonction, mais il obligatoire qu'il possède au minimum les méthodes start et stop qui sont appelées au démarrage et à l'arrêt du démon. Les autres méthodes peuvent être appelées de l'invite de commande. |
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
reload)
reload
;;
condrestart)
if [ -f /var/lock/subsys/$prog ] ; then
stop
# On évite les accès concurent en patientant
# avant de démarrer à nouveau le sous-système
sleep 3
start
fi
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|condrestart|status}"
RETVAL=1
esac
exit $RETVAL
|
Partie contenant le case qui permet d'effectuer l'action demandée par l'utilisateur. |
Il faudra que le programme en question alimente le fichier PID avec le numéro de processus pour que cela fonctionne...
N'hésitez pas à vous inspirer de cette exemple de démon en PHP.
Utilisation
Pour utiliser le sous-système, rien de plus simple. Cela ce fait grâce à la commandes service :
# service monsystem start Starting monsystem: [ OK ] # service monsystem status monsystem (pid 3196) en cours d'exécution... # service monsystem stop Stopping monsystem: [ OK ] # service monsystem status monsystem est arrêté # service monsystem restart Stopping monsystem: [ÉCHOUÉ] Starting monsystem: [ OK ]
Pour enregistrer le service au démarrage :
# chkconfig monsystem on # chkconfig --list monsystem monsystem 0:arrêt 1:arrêt 2:marche 3:marche 4:marche 5:marche 6:arrêt