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 celà (et aussi pour apprendre à créer son propre service...) je recommande vivement la lecture de cette page. En résumé, la commande à utiliser tout le temps 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, 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 :) Voila ce qu'il 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' '/home/moi/scripts/mon-script.sh' '' yes
 ./make_service.sh 'monservice' '/home/moi/scripts/mon-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. Il faut bien sûr avoir les droits root pour lancer le script... Mais pour le reste tout devrait fonctionner.

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 !