Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| creer_un_service_avec_systemd [Le 04/01/2017, 17:22] – [Exemple de service cyclique.] 88.182.40.86 | creer_un_service_avec_systemd [Le 15/11/2020, 17:29] (Version actuelle) – [Exemple de service avancé avec la base graphe neo4j] 176.129.243.67 | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | {{tag> | ||
| + | ---- | ||
| + | ====== Créer un nouveau service avec systemd ====== | ||
| + | Ce tutoriel décrit la démarche à suivre pour transformer un programme en un service [[: | ||
| + | |||
| + | |||
| + | ===== Pré-requis ===== | ||
| + | * Disposer des [[: | ||
| + | * Savoir utiliser le [[: | ||
| + | * Avoir [[: | ||
| + | |||
| + | |||
| + | |||
| + | ===== Principes de base===== | ||
| + | Comme [[: | ||
| + | Ces fichiers de configuration se trouvent dans **/ | ||
| + | |||
| + | <note important> | ||
| + | Dans un [[: | ||
| + | < | ||
| + | |||
| + | Une fois le fichier de configuration de service créé, il faut l' | ||
| + | < | ||
| + | |||
| + | On peut ensuite le lancer pour test et contrôler sa bonne marche avec les commandes suivantes : | ||
| + | < | ||
| + | systemctl status <nom du service> | ||
| + | |||
| + | Pour plus d' | ||
| + | |||
| + | <note help> | ||
| + | Il est possible d' | ||
| + | |||
| + | |||
| + | Pour un service utilisateur il faut ajouter aux commandes le paramètre --user : | ||
| + | |||
| + | < | ||
| + | systemctl --user enable <nom du service> | ||
| + | systemctl --user start <nom du service> | ||
| + | systemctl --user status <nom du service> | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | |||
| + | <note importante> | ||
| + | |||
| + | ===== Type de services systemd ===== | ||
| + | |||
| + | Systemd définit différents types de services : | ||
| + | * Un service de type **simple** (type par défaut) lance un processus principal. Dans le cas où ce processus offre une fonctionnalité à d' | ||
| + | * Un service de type **forking**, | ||
| + | * Un service de type **oneshot** est similaire à un service de type **simple**. Cependant, systemd attend que le processus se termine avant de continuer ses traitements. **Ce type de service est typiquement utilisé comme équivalent aux commandes lancées au démarrage via les scripts d'init system V**. Cela permet à systemd de remplacer ce mécanisme. De ce fait, avec systemd des nouveaux services apparaissent, | ||
| + | * Un service de type **dbus** est similaire à un service de type **simple**. Cependant, le processus du service doit obtenir un nom via D-Bus. systemd pourra alors traiter les autres unités. | ||
| + | * Un service de type **notify** est similaire à un service de type **simple**. Cependant, c'est le processus du service qui avertira systemd (via la fonction sd_notfy(3)) qu'il peut traiter les autres unités. | ||
| + | |||
| + | ===== Exemples de services et leur fichier de configuration===== | ||
| + | |||
| + | ==== Exemples de service de type " | ||
| + | |||
| + | Un exemple est le service iptables. Voici un extrait de son fichier de configuration : | ||
| + | |||
| + | < | ||
| + | [Service] | ||
| + | Type=oneshot | ||
| + | RemainAfterExit=yes | ||
| + | ExecStart=/ | ||
| + | ExecStop=/ | ||
| + | </ | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | \\ | ||
| + | * À son lancement, la commande / | ||
| + | * À son arrêt, la commande / | ||
| + | * Le service iptables continuera d' | ||
| + | |||
| + | ====Exemple de service de type " | ||
| + | Un exemple est le service deluged qui permet de lancer le service correspondant à la version daemon du client bit-torrent [[: | ||
| + | |||
| + | <file txt / | ||
| + | [Unit] | ||
| + | Description=Deluge Bittorrent Client Daemon | ||
| + | After=network-online.target | ||
| + | |||
| + | [Service] | ||
| + | Type=simple | ||
| + | |||
| + | User=deluge | ||
| + | Group=deluge | ||
| + | UMask=007 | ||
| + | |||
| + | ExecStart=/ | ||
| + | |||
| + | Restart=on-failure | ||
| + | |||
| + | # Configures the time to wait before service is stopped forcefully. | ||
| + | TimeoutStopSec=300 | ||
| + | |||
| + | [Install] | ||
| + | WantedBy=multi-user.target | ||
| + | </ | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | ====Exemple de service modèle==== | ||
| + | Il est possible de créer plusieurs services à partir d'un même modèle. Par exemple, la gestion des consoles est gérée par un seul modèle '' | ||
| + | |||
| + | <file txt syncthing@.service> | ||
| + | [Unit] | ||
| + | Description=Syncthing - Open Source Continuous File Synchronization for %I | ||
| + | Documentation=man: | ||
| + | After=network.target | ||
| + | Wants=syncthing-inotify@.service | ||
| + | |||
| + | [Service] | ||
| + | User=%i | ||
| + | ExecStart=/ | ||
| + | Restart=on-failure | ||
| + | SuccessExitStatus=3 4 | ||
| + | RestartForceExitStatus=3 4 | ||
| + | UMask=0002 | ||
| + | |||
| + | [Install] | ||
| + | WantedBy=multi-user.target | ||
| + | </ | ||
| + | |||
| + | * '' | ||
| + | < | ||
| + | * Ici, le '' | ||
| + | < | ||
| + | systemctl enable syncthing@Gerard.service | ||
| + | systemctl enable syncthing@Milou.service | ||
| + | </ | ||
| + | ==== Exemple de service cyclique. ==== | ||
| + | Création du fichier de timer | ||
| + | <file sh / | ||
| + | [Unit] | ||
| + | Description=Lance une mise à jour de l' | ||
| + | [Timer] | ||
| + | OnBootSec=15minutes | ||
| + | # le service démarrera 15 minutes après le démarrage de la machine | ||
| + | OnUnitActiveSec=30minutes | ||
| + | Persistent=true | ||
| + | # le service démarrera toutes les trente minutes après la dernière activation du timer | ||
| + | ### voir toutes les possibilités de choix dans ce document http:// | ||
| + | [Install] | ||
| + | WantedBy=timers.target | ||
| + | </ | ||
| + | Création du fichier de service | ||
| + | <file sh / | ||
| + | [Unit] | ||
| + | Description=Service de mise a jour | ||
| + | After=network.target | ||
| + | |||
| + | [Service] | ||
| + | ExecStart=apt-get update && apt-get upgrade | ||
| + | Type=oneshot | ||
| + | </ | ||
| + | Avec les commandes de gestion associées | ||
| + | < | ||
| + | sudo systemctl start MAJ0.timer | ||
| + | sudo systemctl status MAJ0.timer | ||
| + | </ | ||
| + | |||
| + | ====Exemple de service avancé avec la base graphe neo4j==== | ||
| + | |||
| + | <file txt / | ||
| + | #La configuration de Systemd se base sur des unités (units) qui ont un nom et un type. | ||
| + | |||
| + | ###################################################################### | ||
| + | #La section [Unit] contient de l' | ||
| + | ###################################################################### | ||
| + | # | ||
| + | [Unit] | ||
| + | # | ||
| + | Description=Neo4j Management Service | ||
| + | |||
| + | #Man page du service | ||
| + | Documentation=man: | ||
| + | |||
| + | |||
| + | # Type de l' | ||
| + | #Les différents types d' | ||
| + | # service : pour un service/ | ||
| + | # socket : pour une socket réseau (de tous types : UNIX, Internet, fichier etc.) ; | ||
| + | # mount : pour un système de fichiers (exemple : home.mount), | ||
| + | # swap : pour les partitions d' | ||
| + | # automount : pour un système de fichiers monté à la demande ; | ||
| + | # device : pour un périphérique ; | ||
| + | # timer : pour l' | ||
| + | # path : pour l' | ||
| + | # target : macro-unité qui permet de grouper plusieurs unités (exemple : multi-user.target pour définir une cible) ; | ||
| + | # Ce sont les niveaux d' | ||
| + | # snapshot : unités utilisées pour sauvegarder l’état actuel des services et les restaurer ensuite, par exemple avant de passer en veille. | ||
| + | #Dans cet exemple c'est un service, celui de la base graphe neo4j, qui est notre " | ||
| + | ######################################################################### | ||
| + | #La section [Service] concerne l' | ||
| + | ######################################################################### | ||
| + | # | ||
| + | [Service] | ||
| + | #Lance le service dans un processus système indépendant. | ||
| + | # simple, forking, oneshot, dbus, notify ou idle sont les valeurs possibles de Type=. | ||
| + | Type=forking | ||
| + | |||
| + | # | ||
| + | User=neo4j | ||
| + | |||
| + | #Le lancement de l' | ||
| + | #/var/run étant un lien vers le montage du système de fichiers tmpfs /run. | ||
| + | RuntimeDirectory=neo4j | ||
| + | |||
| + | #Droits d' | ||
| + | # Utilisateur | ||
| + | # | ||
| + | # | ||
| + | RuntimeDirectoryMode=770 | ||
| + | |||
| + | #Où trouver l' | ||
| + | PIDFile=/ | ||
| + | |||
| + | #Démarrer le service neo4j. | ||
| + | ExecStart=/ | ||
| + | |||
| + | #Arrêter le service neo4j. | ||
| + | ExecStop=/ | ||
| + | |||
| + | # | ||
| + | ExecReload=/ | ||
| + | |||
| + | #Ne doit pas considérer que le service est actif lorsque le processus neo4j s'est terminé normalement. | ||
| + | RemainAfterExit=no | ||
| + | |||
| + | #Configure si le service doit être redémarré une fois le processus de service terminé, tué ou si le délai d' | ||
| + | # *Restart=* | ||
| + | # *Choix redémarrage* | ||
| + | # Fin normale ou par signal | ||
| + | # +_______+_________+____________+_____________+______________+___________+_______________+ | ||
| + | # Fin d’exécution avec erreurs | ||
| + | # +_______+_________+____________+_____________+______________+___________+_______________+ | ||
| + | # | ||
| + | # +_______+_________+____________+_____________+______________+___________+_______________+ | ||
| + | # | ||
| + | # +_______+_________+____________+_____________+______________+___________+_______________+ | ||
| + | # Watchdog | ||
| + | # +_______+_________+____________+_____________+______________+___________+_______________+ | ||
| + | Restart=on-failure | ||
| + | |||
| + | #Définit des limites logicielles ou matérielles pour le processus exécuté. | ||
| + | # | ||
| + | # Correspond à ulimit -n 60000. | ||
| + | # C'est le nombre maximum de fichiers pouvant être ouvert simultanément pour les processus fils du service. | ||
| + | LimitNOFILE=60000 | ||
| + | |||
| + | #Une directive pour configurer TimeoutStartSec = et TimeoutStopSec = à la valeur spécifiée. | ||
| + | # TimeoutStartSec= configure le délai d' | ||
| + | # TimeoutStopSec = configure le temps d' | ||
| + | TimeoutSec=600 | ||
| + | |||
| + | |||
| + | ############################################################################################################################## | ||
| + | # La section [Install] s' | ||
| + | ############################################################################################################################## | ||
| + | [Install] | ||
| + | # | ||
| + | WantedBy=multi-user.target | ||
| + | </ | ||
| + | ===== Ressources ====== | ||
| + | * [[wpfr> | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | |||
| + | ---- | ||
| + | // | ||
