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 27/01/2017, 16:29] – Correction orthographe sefran | 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:// | ||
+ | |||
+ | |||
+ | ---- | ||
+ | // |