Dominique Meeùs
Dernière modification le   
retour à la table des matières — à l’index — à ma page de départ

Lancer un service au démarrage (ou le désactiver)

Comment obtenir qu’une application démarre avec le serveur ? Il faut être attentif au fait qu’il y a plusieurs systèmes : le System V init traditionnel, Upstart dans certaines distributions, dont Ubuntu à partir de 6.10 et plus récemment systemd. Si on administre un serveur Debian, il est probablement en style System V. Voir System V init : http://www.debian.org/doc/debian-policy/ch-opersys.html#s-sysvinit, la commande man 5 init : http://manpages.ubuntu.com/manpages/precise/en/man5/init.5.html et The Upstart Cookbook : http://upstart.ubuntu.com/cookbook/.

En systemd, on lance un script (#!/bin/sh et cetera) en l’appelant d’un fichier service dans /etc/systemd/system. Voir How to write startup script for systemd

En systemd, on liste les services avec la commande systemctl.

En Upstart, la commande initctl list montre l’état des divers services.

Pour démarrer un service en System V, il faut dans /etc/init.d un script, disons /etc/init.d/mydaemon qui commande le service. Le script doit accepter en paramètre sur la ligne de commande les commandes start, stop, restart, reload (optionnel — recharger le fichier de configuration), force-reload (recharger le fichier de configuration si c’est possible, redémarrer sinon). On peut alors lancer le service par la commande

$ sudo /etc/init.d/mydaemon start

La commande service sert à démarrer les services par leur script dans /etc/init.d ; on peut donc faire aussi

$ sudo service mydaemon start

Je constate que service existe dans un Ubuntu 10.4 Desktop, mais pas dans un serveur Lenny, lequel offre par contre invoke-rc.d comme Ubuntu.

Pour un démarrage automatique (System V) lors du boot, il faut des liens symboliques à ce script dans les /etc/rc?.d des runlevel appropriés. Supposons que le script soit /etc/init.d/mydaemon. On aurait normalement besoin de quelque chose comme

$ sudo ln -s /etc/init.d/mydeamon /etc/rc6.d/K15mydeamon
$ sudo ln -s /etc/init.d/mydeamon /etc/rc0.d/K15mydeamon
$ sudo ln -s /etc/init.d/mydeamon /etc/rc1.d/K15mydeamon
$ sudo ln -s /etc/init.d/mydeamon /etc/rc2.d/S84mydeamon
$ sudo ln -s /etc/init.d/mydeamon /etc/rc3.d/S84mydeamon
$ sudo ln -s /etc/init.d/mydeamon /etc/rc4.d/S84mydeamon
$ sudo ln -s /etc/init.d/mydeamon /etc/rc5.d/S84mydeamon

où K veut dire kill et S start, les deux chiffres suivants donnant l’ordre des opérations. Voyez votre /etc/rc3.d par exemple. Attention, contrairement à d’autres Linux, Debian ne différencie pas a priori les niveaux 2 à 5.

Certains semblent dire que la commande update-rc.d serait destinée aux scripts dans les packages, déconseillée en usage courant pour lequel on recommande sysv-rc-conf ou bum (GTK2), qui ne sont pas présents par défaut dans Lenny. D’autres au contraire disent que la commande

$ sudo update-rc.d mydaemon defaults

donnerait plus sûrement des liens symboliques comme ci-dessus. En y regardant d’un peu plus près, les défauts ne sont pas recommandés, parce qu’ils donnent 20 partout alors qu’on recommande que les numéros d’ordre de démarrage et d’arrêt aient une somme de 99 (comme ci-dessus) ou 100. La bonne commande serait alors

$ sudo update-rc.d mydaemon defaults 85 15

pour une application qui ne doit pas démarrer dans les premières. Les commandes

$ sudo update-rc.d mydaemon disable
$ sudo update-rc.d mydaemon enable

permettent de suspendre ou de rétablir le démarrage automatique. Cela comporte cependant le risque de se perdre dans une mise à jour. On recommande maintenant plutôt de contrôler la désactivation d’un service par un fichier override comme dans l’exemple echo "manual" > /etc/init/apport.override pour désactiver le service apport de rapports de bugs s’il devient envahissant.

Exemple : démarrer JBoss (pour OpenKM) L’installation d’OpenKM dans un serveur JBoss ne comporte pas le démarrage automatique de l’application avec le serveur. J’ai trouvé pour cela en http://blog.fh-kaernten.at/wehr/2010/07/08/openkm-our-new-document-management-system-nice/ un script jbossokm pour /etc/init.d

Par défaut, JBoss n’écoute que localhost. Sinon, on peut ouvrir, par exemple au monde entier par le commutateur -b 0.0.0.0, mais il faudrait alors prendre des mesures de sécurité. Voir http://community.jboss.org/wiki/SecureJBoss

Dans http://forum.openkm.com/viewtopic.php?f=4&t=3620, une variante lance d’abord OpenOffice.org comme un service, mais des versions plus récentes d’OpenKM lancent elles-mêmes OpenOffice.org. La page http://community.jboss.org/wiki/StartJBossOnBootWithLinux explique en outre la question des runlevels.

Exemple : démarrer OpenOffice.org headless

#!/bin/sh
### BEGIN INIT INFO
# Provides: OpenOffice Headless
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 5
# Default-Stop:
# Short-Description: OpenOffice Headless
### END INIT INFO
# Les versions récentes d’OpenKM et d’Alfresco
# prennent en charge le lancement d’OpenOffice.org
# et ce script n’est plus nécessaire.
PIDFILE=/var/run/openoffice-server.pid
case "$1" in
'start')
if [ -f $PIDFILE ]; then
echo "OpenOffice headless server has already started."
sleep 5
exit
fi
echo "Starting OpenOffice headless server"
soffice "-accept=socket,host=localhost,port=8100;urp;StarOffice.ServiceManager" -nologo -headless -nofirststartwizard & > /dev/null 2>&1
touch $PIDFILE
;;
'stop')
if [ -f $PIDFILE ]; then
echo "Stopping OpenOffice headless server."
killall -9 soffice && killall -9 soffice.bin
rm -f $PIDFILE
exit
fi
echo "Openoffice headless server is not running."
exit
;;
*)
echo "Usage: $0 { start | stop }"
;;
esac
exit 0
Dominique Meeùs . Date: 2011… 2016