Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
creer_un_service_avec_systemd [Le 27/01/2017, 18:20]
sefran Modification pédagogique
creer_un_service_avec_systemd [Le 23/07/2024, 11:54] (Version actuelle)
217.114.205.206 [Principes de base]
Ligne 21: Ligne 21:
 <​code>​sudo cp -r /​etc/​systemd/​system /​etc/​systemd/​system.save$(date +%Y%m%d)</​code></​note>​ <​code>​sudo cp -r /​etc/​systemd/​system /​etc/​systemd/​system.save$(date +%Y%m%d)</​code></​note>​
  
-Une fois le fichier de configuration de service ​crée, il faut l'​activer pour qu'il soit pris en compte par le système et lancé à chaque démarrage.+Une fois le fichier de configuration de service ​créé, il faut l'​activer pour qu'il soit pris en compte par le système et lancé à chaque démarrage.
 <​code>​systemctl enable <nom du service>​.service</​code>​ <​code>​systemctl enable <nom du service>​.service</​code>​
  
Ligne 30: Ligne 30:
 Pour plus d'​infos sur les diverses commandes de gestion, voir la page [[:​systemd#​les_services|systemd]] Pour plus d'​infos sur les diverses commandes de gestion, voir la page [[:​systemd#​les_services|systemd]]
  
 +<note help>
 +Il est possible d'​utiliser un service au niveau utilisateur,​ dans ce cas, les fichiers de configuration se trouvent dans **~/​.config/​systemd/​user/​**
 +
 +
 +Pour un service utilisateur il faut ajouter aux commandes le paramètre --user :
 +
 +<​code>​
 +systemctl --user enable <nom du service>​.service
 +systemctl --user start <nom du service>​.service
 +systemctl --user status <nom du service>​.service
 +</​code>​
 +
 +</​note>​
 +
 +Pour créer un service utilisateur :
 +
 +<​code>​
 +systemctl --user edit <nom du service>​.service --full --force
 +</​code>​
 +
 +Pour éditer un service utilisateur :
 +
 +<​code>​
 +systemctl --user edit <nom du service>​.service --full
 +</​code>​
 +
 +Pour ajouter une surcharge (drop-in) sur un service utilisateur :
 +
 +<​code>​
 +systemctl --user edit <nom du service>​.service
 +</​code>​
 +
 +<note important>​Attention : pour un service user, il faut remplacer ''​WantedBy=multi-user.target''​ par ''​WantedBy=default.target''​.</​note>​
 ===== Type de services systemd ===== ===== Type de services systemd =====
  
-Systemd ​defini differents ​types de services : +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'autre processus sur le système, ses canaux de communication doivent être installés avant que le processus principal soit démarré. Ce qui est rendu possible par l'​activation des sockets, et autres canaux de communication. Ainsi, systemd peut traiter les autres unités sans se préoccuper de la fin du lancement d'une unité de type "​simple"​.+  *  Un service de type **simple** (type par défaut) lance un processus principal. Dans le cas où ce processus offre une fonctionnalité à d'autres ​processus sur le système, ses canaux de communication doivent être installés avant que le processus principal soit démarré. Ce qui est rendu possible par l'​activation des sockets, et autres canaux de communication. Ainsi, systemd peut traiter les autres unités sans se préoccuper de la fin du lancement d'une unité de type "​simple"​.
   * Un service de type **forking**,​ lance un processus père qui créera un processus fils dans le cadre de son démarrage. Le processus parent est prévu pour s’arrêter une fois le démarrage complet et que tous les canaux de communication sont mis en place. Le processus fils continue à fonctionner en tant que le processus principal du service. systemd poursuit le traitement des autres unités une fois que le processus père se termine. **Ce type de service correspond aux services UNIX traditionnels.**   * Un service de type **forking**,​ lance un processus père qui créera un processus fils dans le cadre de son démarrage. Le processus parent est prévu pour s’arrêter une fois le démarrage complet et que tous les canaux de communication sont mis en place. Le processus fils continue à fonctionner en tant que le processus principal du service. systemd poursuit le traitement des autres unités une fois que le processus père se termine. **Ce type de service correspond aux services UNIX traditionnels.**
   * 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,​ alors qu'ils auraient été simplement des scripts d'init avec SysVinit.   * 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,​ alors qu'ils auraient été simplement des scripts d'init avec SysVinit.
Ligne 50: Ligne 83:
 RemainAfterExit=yes RemainAfterExit=yes
 ExecStart=/​usr/​libexec/​iptables.init start ExecStart=/​usr/​libexec/​iptables.init start
-ExecStop=/​usr/​libexec/​iptables.init stop +ExecStop=/​usr/​libexec/​iptables.init stop
 </​file>​ </​file>​
  
Ligne 57: Ligne 90:
   * ''​RemainAfterExit''​ à la valeur "​yes"​ permet d'​indiquer que quand la commande de lancement (ExecStart) est terminée, le service est considéré comme toujours lancé. Ce paramètre est très utile pour les services de type "​oneshot"​ qui exécutent une commande à leur lancement (ExecStart) sans qu'il y ait un processus spécifique qui reste en exécution.   * ''​RemainAfterExit''​ à la valeur "​yes"​ permet d'​indiquer que quand la commande de lancement (ExecStart) est terminée, le service est considéré comme toujours lancé. Ce paramètre est très utile pour les services de type "​oneshot"​ qui exécutent une commande à leur lancement (ExecStart) sans qu'il y ait un processus spécifique qui reste en exécution.
 \\ \\
-  *  ​A ​son lancement, la commande /​usr/​libexec/​iptables.init start est exécutée. Cette commande va permettre de charger des modules iptables et les règles iptables que le modules netfilter du noyau linux va prendre en compte. +  * À son lancement, la commande /​usr/​libexec/​iptables.init start est exécutée. Cette commande va permettre de charger des modules iptables et les règles iptables que le modules netfilter du noyau linux va prendre en compte. 
-  * son arrêt, la commande /​usr/​libexec/​iptables.init stop est exécutée. Cette commande va permettre de remettre en place la politique de traitements iptables par défaut et de décharger les modules iptables.+  * À son arrêt, la commande /​usr/​libexec/​iptables.init stop est exécutée. Cette commande va permettre de remettre en place la politique de traitements iptables par défaut et de décharger les modules iptables.
   * Le service iptables continuera d'​apparaitre comme actif après la fin de la commande /​usr/​libexec/​iptables.init start et jusqu’à ce qu'il soit explicitement arrêté.   * Le service iptables continuera d'​apparaitre comme actif après la fin de la commande /​usr/​libexec/​iptables.init start et jusqu’à ce qu'il soit explicitement arrêté.
  
 ====Exemple de service de type "​simple"​==== ====Exemple de service de type "​simple"​====
-Un exemple est le service deluged qui permet de lancer le service correspondant à la version ​deamon ​du client bit-torrent [[:​deluge]].+Un exemple est le service deluged qui permet de lancer le service correspondant à la version ​daemon ​du client bit-torrent [[:​deluge]].
  
 <file txt /​etc/​systemd/​system/​deluged.service>​ <file txt /​etc/​systemd/​system/​deluged.service>​
Ligne 85: Ligne 118:
 [Install] [Install]
 WantedBy=multi-user.target WantedBy=multi-user.target
-</​file> ​+</​file>​
  
   * ''​Description''​ permet de donner une description du service qui apparaîtra lors de l'​utilisation de la commande ''​systemctl status <​nom_du_service>''​   * ''​Description''​ permet de donner une description du service qui apparaîtra lors de l'​utilisation de la commande ''​systemctl status <​nom_du_service>''​
-  * ''​After''​ permet d'​indiquer quel pré-requis est nécessaire pour le fonctionnement du service. Ici, on indique qu'il faut attendre que l'​ordinateur ait accès à Internet pour lancer le daemon. ​FIXME **à vérifier :** Si l'​accès à Internet est perdu, le service est arrêté automatiquement.\\+  * ''​After''​ permet d'​indiquer quel pré-requis est nécessaire pour le fonctionnement du service. Ici, on indique qu'il faut attendre que l'​ordinateur ait accès à Internet pour lancer le daemon. ​L'​accès à Internet est perdu, le service ​n'est pas arrêté automatiquement, pour obtenir cet effet, il faut utiliser une balise ''​Requires='' ​\\
   * ''​Type''​ permet de specifier le type de service   * ''​Type''​ permet de specifier le type de service
-  * ''​User'',​ ''​Group''​ et ''​Umask''​ permet d'​identifier qui est le propriaitaire ​du processus et donc les attributs des fichiers téléchargés. Ici, les fichiers téléchargés seront accessibles en Lecture/​Ecriture à l'​utilisateur ''​Deluge''​ et aux membres du groupe ''​Deluge''​ et invisibles aux autres utilisateurs du système.+  * ''​User'',​ ''​Group''​ et ''​Umask''​ permet d'​identifier qui est le propriétaire ​du processus et donc les attributs des fichiers téléchargés. Ici, les fichiers téléchargés seront accessibles en Lecture/​Ecriture à l'​utilisateur ''​Deluge''​ et aux membres du groupe ''​Deluge''​ et invisibles aux autres utilisateurs du système.
   * ''​Restart''​ permet de relancer le service automatiquement en cas de plantage.   * ''​Restart''​ permet de relancer le service automatiquement en cas de plantage.
   * ''​WantedBy''​ permet de spécifier dans quel Target doit être actif le service. Ici, en spécifiant ''​multi-user.target'',​ le service est actif dans les Runlevels 2, 3, 4 et 5. Pour en savoir plus sur les **Targets**,​ consultez la page de [[:​systemd#​les_targets|systemd]]\\   * ''​WantedBy''​ permet de spécifier dans quel Target doit être actif le service. Ici, en spécifiant ''​multi-user.target'',​ le service est actif dans les Runlevels 2, 3, 4 et 5. Pour en savoir plus sur les **Targets**,​ consultez la page de [[:​systemd#​les_targets|systemd]]\\
Ligne 123: Ligne 156:
 systemctl enable syncthing@Milou.service systemctl enable syncthing@Milou.service
 </​code>​ </​code>​
 +**Qu'​est ce qu'un timer--
 +
 +Les timers sont des fichiers de programmation qui vont se charger de lancer des services à intervalles réguliers.
 +
 +Quand vous créez un timer, il doit avoir l'​extension .timer. Un service .service du même nom doit exister. (le service est souvent un service minimaliste,​ de type oneshot, permettant de lancer une commande)
 +
 +Les timers «pourraient presque» remplacer le planificateur de tâches cron.
 +
 ==== Exemple de service cyclique. ==== ==== Exemple de service cyclique. ====
-Création du fichier de gestion ​ =>               /​etc/​systemd/​system/​MAJ0.timer +Création du fichier de timer 
-<code>​[Unit] +<file sh /​etc/​systemd/​system/​MAJ0.timer>​ 
-Description=effectue ​une mise à jour de l'​ordinateur quinze minutes après le démarrage de la machine et  itère toutes les trente minutes.+[Unit] 
 +Description=Lance une mise à jour de l'​ordinateur quinze minutes après le démarrage de la machine et  itère toutes les trente minutes.
 [Timer] [Timer]
-OnBootSec=15minutes ​  ​+OnBootSec=15minutes
 # le service démarrera 15 minutes après le démarrage de la machine # le service démarrera 15 minutes après le démarrage de la machine
-OnUnitActiveSec=30minutes ​ +OnUnitActiveSec=30minutes 
 +Persistent=true
 # le service démarrera toutes les trente minutes après la dernière activation du timer # 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://​man7.org/​linux/​man-pages/​man7/​systemd.time.7.html+###    voir toutes les possibilités de choix  dans ce  document ​https://​man7.org/​linux/​man-pages/​man7/​systemd.time.7.html
 [Install] [Install]
 WantedBy=timers.target WantedBy=timers.target
 +</​file>​
 +Création du fichier de service
 +<file sh /​etc/​systemd/​system/​MAJ0.service>​
 +[Unit]
 +Description=Service de mise a jour
 +After=network.target
 +
 [Service] [Service]
-User=XXXXXXXXX ​ # à renseigner ? root par défaut. +ExecStart=apt-get update && ​apt-get upgrade 
-Group=users +Type=oneshot 
-ExecStart=/​etc/​init.d/​MAJ0</​code>​ +</file
-Création du fichier contenant ce qu'il faut faire   ​donc ​ sous /​etc/​initi.d/​MAJ0 dans cet exemple +Avec les commandes ​de gestion ​associées 
-<​code>​ +<​code>​sudo systemctl ​enable ​MAJ0.timer  
-#! /bin/sh +sudo systemctl ​start  ​MAJ0.timer 
-date >/​var/​log/​MAJ0.log +sudo systemctl ​status ​MAJ0.timer 
-echo "Faire les mises à jour" >>/​var/​log/​MAJ0.log +</​code>​
-sudo apt install tototo ​ >>/​var/​log/​MAJ0.log +
-sudo apt autoremove +
-echo  "Pas encore trouvé pour informer l'​utilisateur de la proposition d'​épuration. Donc rien n'est épuré"​ >>/​var/​log/​MAJ0.log +
-exit 0 </code+
-Avec les commande ​de gestion ​assiociées +
-<​code>​sudo systemctl ​start  ​MAJ0.timer +
-sudo systemctl ​status ​MAJ0.time +
-sudo systemctl ​stop   MAJ0.timer +
-sudo systemctl daemon-reload  +
-sudo systemctl enable MAJ0.timer ​</​code>​+
  
 ====Exemple de service avancé avec la base graphe neo4j==== ====Exemple de service avancé avec la base graphe neo4j====
Ligne 173: Ligne 213:
  
 # Type de l'​Unité systemd. # Type de l'​Unité systemd.
-#Les différents types d'​unités sont : +#Les différents types d'​unités sont :
 #    service : pour un service/​démon ; #    service : pour un service/​démon ;
 #    socket : pour une socket réseau (de tous types : UNIX, Internet, fichier etc.) ; #    socket : pour une socket réseau (de tous types : UNIX, Internet, fichier etc.) ;
Ligne 191: Ligne 231:
 #​https://​www.freedesktop.org/​software/​systemd/​man/​systemd.service.html #​https://​www.freedesktop.org/​software/​systemd/​man/​systemd.service.html
 [Service] [Service]
-#Lance le service dans un processus système indépendant. ​+#Lance le service dans un processus système indépendant.
 # simple, forking, oneshot, dbus, notify ou idle sont les valeurs possibles de Type=. # simple, forking, oneshot, dbus, notify ou idle sont les valeurs possibles de Type=.
 Type=forking Type=forking
Ligne 199: Ligne 239:
  
 #Le lancement de l'​unité neo4j.service doit créer un répertoire neo4j dans /run. #Le lancement de l'​unité neo4j.service doit créer un répertoire neo4j dans /run.
-#/var/run étant un lien vers le mountage ​du système de fichiers tmpfs /run.+#/var/run étant un lien vers le montage ​du système de fichiers tmpfs /run.
 RuntimeDirectory=neo4j RuntimeDirectory=neo4j
  
-#Droits d'​accès sur le réperoitre ​/run/neo4j.+#Droits d'​accès sur le répertoire ​/run/neo4j.
 # Utilisateur ​ Groupe ​   Les_autres # Utilisateur ​ Groupe ​   Les_autres
 #     ​rwx ​       rwx        --- #     ​rwx ​       rwx        ---
Ligne 220: Ligne 260:
 ExecReload=/​usr/​bin/​neo4j restart ExecReload=/​usr/​bin/​neo4j restart
  
-#Ne doit pas considéré ​que le service est actif si le processus neo4j c'​est ​fini.+#Ne doit pas considérer ​que le service est actif lorsque ​le processus neo4j s'​est ​terminé normalement.
 RemainAfterExit=no RemainAfterExit=no
  
Ligne 238: Ligne 278:
 Restart=on-failure Restart=on-failure
  
-#Définit des limites ​logicielle ​ou matérielles pour le processus exécuté.+#Définit des limites ​logicielles ​ou matérielles pour le processus exécuté.
 #​https://​www.freedesktop.org/​software/​systemd/​man/​systemd.exec.html#​ #​https://​www.freedesktop.org/​software/​systemd/​man/​systemd.exec.html#​
-# Correspond à ulimit -n 60000.  +# Correspond à ulimit -n 60000. 
-# C'est le nombre maximum de fichiers pouvant être ouvert ​simultanéments ​pour les processus fils du service.+# C'est le nombre maximum de fichiers pouvant être ouvert ​simultanément ​pour les processus fils du service.
 LimitNOFILE=60000 LimitNOFILE=60000
  
Ligne 259: Ligne 299:
 ===== Ressources ====== ===== Ressources ======
   * [[wpfr>​systemd|systemd]] sur Wikipedia en français   * [[wpfr>​systemd|systemd]] sur Wikipedia en français
-  * [[http://​www.freedesktop.org/​wiki/​Software/​systemd/​|Site officiel de systemd]] +  * [[https://​www.freedesktop.org/​wiki/​Software/​systemd/​|Site officiel de systemd]] 
-  * [[http://​doc.fedora-fr.org/​wiki/​Systemd|Fedora et systemd]] notamment pour la partie [[#Type de service systemd]]+  * [[https://​doc.fedora-fr.org/​wiki/​Systemd|Fedora et systemd]] notamment pour la partie [[#Type de service systemd]]
   * [[https://​docs.syncthing.net/​users/​autostart.html#​using-systemd|Documentation de Syncthing]] Créer un service systemd pour lancer Syncthing au démarrage (en anglais)   * [[https://​docs.syncthing.net/​users/​autostart.html#​using-systemd|Documentation de Syncthing]] Créer un service systemd pour lancer Syncthing au démarrage (en anglais)
-  * [[http://dev.deluge-torrent.org/wiki/UserGuide/Service/​systemd|Documentation de Deluge]] Créer un service systemd pour lancer Deluge au démarrage (en anglais)+  * [[https://deluge.readthedocs.io/en/latest/how-to/systemd-service.html|Documentation de Deluge]] Créer un service systemd pour lancer Deluge au démarrage (en anglais)
  
  
 ---- ----
 //​Contributeurs:​ [[:​utilisateurs:​zarmu]]//​ //​Contributeurs:​ [[:​utilisateurs:​zarmu]]//​
  • creer_un_service_avec_systemd.1485537635.txt.gz
  • Dernière modification: Le 27/01/2017, 18:20
  • par sefran