Créer un service avec systemd

Le besoin

Historiquement, faire en sorte qu’un script personnel se lance au démarrage n’était pas très compliqué. Dans l’ancien system V, il suffisait de jouer avec les scripts (et les liens) dans /etc/init.d et /etc/rcX.d, et on arrivait facilement à avoir quelque chose qui se lançait proprement avec des commandes du style « service mon_service start » et « service mon_service stop ». Si le bon lien était créé dans /etc/rc2.d par exemple (S99mon_service), alors il se lançait aussi automatiquement au boot. Simple.

Malheureusement (heureusement ?) Systemd est venu modifier tout ça. Je ne rentrerai pas dans le détail de tout ce que systemd apporte par rapport à system V (parallélisation, gestion des dépendances, supervision des services etc). Disons simplement qu’il est beaucoup, beaucoup plus évolué que l’ancien système. Ce qui explique qu’il a été choisi par la grande majorité des distributions linux les plus connus. Pour avoir un bon aperçu des fonctionnalités de systemd, je vous renvoie à cet article de linuxfr. Mais qui dit « plus évolué » dit aussi un peu plus compliqué à utiliser. Quelle est donc la procédure à suivre pour faire exactement la même chose qu’avant ? Créer un service simple, qui se contente de lancer le script shell de notre choix lors du boot de la machine ?

La solution

Avant tout, il conviendra de se familiariser un peu avec les commandes de systemd. Pour cela (et aussi pour apprendre à créer son propre service…) je recommande vivement la lecture de cette page. En résumé, la commande à utiliser est « systemctl ». puis l’argument (status, start, stop, enable, disable…). Enfin le nom du service. (pour status, le fait de l’utiliser sans services permet d’avoir la liste de tous les services avec leur hiérarchie).

Pour créer notre propre service, il faut créer un fichier texte dans /etc/systemd/system/. Ce fichier texte va décrire le service, ses dépendances, ce qui se passe en cas d’échec etc. Ensuite il faudra activer ce nouveau service. Et comme je suis trop gentil, je vous ai fait un mini script qui fait tout ça automatiquement. (Lisez le, on ne peut rien faire de plus basique que ça). Voila ce que son exécution affiche sans argument:

root@gemeaux:/tmp# ./make_service.sh
Ce script fabrique un « service » qui lance un script shell sous systemd Il nécessite obligatoirement 4 arguments qui sont:
– Le nom du service
– Le chemin complet du script à lancer
– Le nom des services qui doivent déjà avoir été lancés
– yes ou no: yes si à la fin du script on considère que le service est toujours actif no dans le cas contraire (utile si le script en question est censé tourner tout le temps)

 

Exemples :

./make_service.sh 'monservice' '/rep/script.sh' '' yes
./make_service.sh 'monservice' '/home/rep/script.sh'
'apache2.service postfix.service' yes

Dans le second cas, notre service ne sera lancé qu’après apache et postfix.

Les pièges à éviter

Le script à lancer doit absolument signaler son interpréteur de commande, et donc commencer par: #!/bin/bash. ll doit aussi avoir les droits en exécution. Enfin, et même si c’est évident, il faut avoir les droits root pour lancer le script.

Suppression du service

Rien de plus simple. Il suffira de le désactiver (systemctl disable nom_du_service) puis de supprimer le fichier texte qui le décrit:

rm /etc/systemd/system/monservice.service

Amusez vous bien !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.