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:32] – Explication de target pour systemd Sefran | creer_un_service_avec_systemd [Le 27/05/2026, 19:38] (Version actuelle) – mise en forme krodelabestiole | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| {{tag> | {{tag> | ||
| - | ---- | ||
| ====== Créer un nouveau service avec systemd ====== | ====== Créer un nouveau service avec systemd ====== | ||
| + | |||
| Ce tutoriel décrit la démarche à suivre pour transformer un programme en un service [[: | Ce tutoriel décrit la démarche à suivre pour transformer un programme en un service [[: | ||
| - | |||
| ===== Pré-requis ===== | ===== Pré-requis ===== | ||
| - | | + | |
| + | | ||
| * Savoir utiliser le [[: | * Savoir utiliser le [[: | ||
| * Avoir [[: | * Avoir [[: | ||
| - | |||
| - | |||
| ===== Principes de base===== | ===== Principes de base===== | ||
| + | |||
| Comme [[: | Comme [[: | ||
| Ces fichiers de configuration se trouvent dans **/ | Ces fichiers de configuration se trouvent dans **/ | ||
| Ligne 21: | Ligne 20: | ||
| < | < | ||
| - | Une fois le fichier de configuration de service | + | Une fois le fichier de configuration de service |
| < | < | ||
| Ligne 29: | Ligne 28: | ||
| Pour plus d' | 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> | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | |||
| + | Pour créer un service utilisateur : | ||
| + | |||
| + | < | ||
| + | systemctl --user edit <nom du service> | ||
| + | </ | ||
| + | |||
| + | Pour éditer un service utilisateur : | ||
| + | |||
| + | < | ||
| + | systemctl --user edit <nom du service> | ||
| + | </ | ||
| + | |||
| + | Pour ajouter une surcharge (drop-in) sur un service utilisateur : | ||
| + | |||
| + | < | ||
| + | systemctl --user edit <nom du service> | ||
| + | </ | ||
| + | |||
| + | <note important> | ||
| + | |||
| + | ===== 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' | ||
| + | |||
| + | Les timers remplacent le planificateur de tâches cron sur les systèmes modernes. | ||
| ===== Type de services systemd ===== | ===== Type de services systemd ===== | ||
| - | Systemd | + | Systemd |
| - | * 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' | + | * Un service de type **simple** (type par défaut) lance un processus principal. Dans le cas où ce processus offre une fonctionnalité à d'autres |
| * Un service de type **forking**, | * 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 **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 **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 | + | * 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 |
| ===== Exemples de services et leur fichier de configuration===== | ===== Exemples de services et leur fichier de configuration===== | ||
| Ligne 50: | Ligne 90: | ||
| RemainAfterExit=yes | RemainAfterExit=yes | ||
| ExecStart=/ | ExecStart=/ | ||
| - | ExecStop=/ | + | ExecStop=/ |
| </ | </ | ||
| Ligne 57: | Ligne 97: | ||
| * '' | * '' | ||
| \\ | \\ | ||
| - | * | + | * À son lancement, la commande / |
| - | * A son arrêt, la commande / | + | * À son arrêt, la commande / |
| * Le service iptables continuera d' | * Le service iptables continuera d' | ||
| ====Exemple de service de type " | ====Exemple de service de type " | ||
| - | Un exemple est le service deluged qui permet de lancer le service correspondant à la version | + | Un exemple est le service deluged qui permet de lancer le service correspondant à la version |
| <file txt / | <file txt / | ||
| Ligne 85: | Ligne 125: | ||
| [Install] | [Install] | ||
| WantedBy=multi-user.target | WantedBy=multi-user.target | ||
| - | </ | + | </ |
| * '' | * '' | ||
| - | * '' | + | * '' |
| * '' | * '' | ||
| - | * '' | + | * '' |
| * '' | * '' | ||
| * '' | * '' | ||
| Ligne 123: | Ligne 163: | ||
| systemctl enable syncthing@Milou.service | systemctl enable syncthing@Milou.service | ||
| </ | </ | ||
| - | ==== Exemple de service cyclique. ==== | + | |
| - | Création du fichier de gestion | + | ==== Exemple de service cyclique ==== |
| - | < | + | |
| - | Description=effectue | + | === Service systeme === |
| + | |||
| + | Création du fichier de timer | ||
| + | <file sh / | ||
| + | [Unit] | ||
| + | Description=Lance une mise à jour de l' | ||
| [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 | + | ### voir toutes les possibilités de choix dans ce document |
| [Install] | [Install] | ||
| WantedBy=timers.target | WantedBy=timers.target | ||
| + | </ | ||
| + | Création du fichier de service | ||
| + | <file sh / | ||
| + | [Unit] | ||
| + | Description=Service de mise a jour | ||
| + | After=network.target | ||
| + | |||
| [Service] | [Service] | ||
| - | User=XXXXXXXXX | + | ExecStart=apt-get update && apt-get upgrade |
| - | Group=users | + | Type=oneshot |
| - | ExecStart=/ | + | </file> |
| - | Création du fichier contenant ce qu'il faut faire | + | Avec les commandes de gestion associées |
| - | < | + | <code bash>sudo systemctl enable MAJ0.timer |
| - | #! /bin/sh | + | sudo systemctl start MAJ0.timer |
| - | date >/ | + | sudo systemctl status |
| - | echo "Faire les mises à jour" >>/ | + | </code> |
| - | sudo apt install tototo | + | === Service utilisateur === |
| - | sudo apt autoremove | + | Création et activation du service |
| - | echo | + | <code bash>cat <<"EOF" >$HOME/.config/systemd/user/Alerte.service |
| - | exit 0 </ | + | [Unit] |
| - | Avec les commande de gestion assiociées | + | Description=Rappeler que le moment est venu. |
| - | < | + | [Service] |
| - | sudo systemctl status MAJ0.time | + | Type=simple |
| - | sudo systemctl stop MAJ0.timer | + | ExecStart=zenity --warning --text |
| - | sudo systemctl | + | EOF |
| - | sudo systemctl | + | sleep 1 |
| + | systemctl --user enable Alerte.service; | ||
| + | systemctl --user start Alerte.service; | ||
| + | Création et activation des déclenchements | ||
| + | < | ||
| + | [Unit] | ||
| + | Description=indique les moments retenus. | ||
| + | [Timer] | ||
| + | OnCalendar=Mon-Sat *-*-* 10:20:30 | ||
| + | OnCalendar=Sun *-*-* 12:14:16 | ||
| + | [Install] | ||
| + | WantedBy=timers.target | ||
| + | EOF | ||
| + | sleep 1 | ||
| + | systemctl --user enable Alerte.timer; | ||
| + | systemctl | ||
| + | |||
| ====Exemple de service avancé avec la base graphe neo4j==== | ====Exemple de service avancé avec la base graphe neo4j==== | ||
| Ligne 163: | Ligne 233: | ||
| #La section [Unit] contient de l' | #La section [Unit] contient de l' | ||
| ###################################################################### | ###################################################################### | ||
| + | # | ||
| [Unit] | [Unit] | ||
| - | # | + | # |
| Description=Neo4j Management Service | Description=Neo4j Management Service | ||
| + | |||
| + | #Man page du service | ||
| + | Documentation=man: | ||
| - | # Type de l' | + | # Type de l' |
| - | #Les différent | + | #Les différents |
| # service : pour un service/ | # service : pour un service/ | ||
| # 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 181: | Ligne 255: | ||
| # Ce sont les niveaux d' | # 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. | # 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 | + | #Dans cet exemple |
| ######################################################################### | ######################################################################### | ||
| #La section [Service] concerne l' | #La section [Service] concerne l' | ||
| ######################################################################### | ######################################################################### | ||
| + | # | ||
| [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=. | ||
| Type=forking | Type=forking | ||
| - | # | + | # |
| User=neo4j | User=neo4j | ||
| - | #Le lancement de l' | + | #Le lancement de l' |
| - | #/var/run étant un lien vers le mountage | + | #/var/run étant un lien vers le montage |
| RuntimeDirectory=neo4j | RuntimeDirectory=neo4j | ||
| - | #Droits d' | + | #Droits d' |
| # Utilisateur | # Utilisateur | ||
| # | # | ||
| Ligne 202: | Ligne 278: | ||
| RuntimeDirectoryMode=770 | RuntimeDirectoryMode=770 | ||
| - | #Où trouver l' | + | #Où trouver l' |
| PIDFile=/ | PIDFile=/ | ||
| - | #Démarrer le service neo4j | + | #Démarrer le service neo4j. |
| ExecStart=/ | ExecStart=/ | ||
| - | #Arrêter le service neo4j | + | #Arrêter le service neo4j. |
| ExecStop=/ | ExecStop=/ | ||
| - | # | + | # |
| ExecReload=/ | ExecReload=/ | ||
| - | # | + | #Ne doit pas considérer que le service est actif lorsque le processus neo4j s'est terminé normalement. |
| RemainAfterExit=no | 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 | 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 | 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 | TimeoutSec=600 | ||
| Ligne 236: | Ligne 329: | ||
| ===== Ressources ====== | ===== Ressources ====== | ||
| * [[wpfr> | * [[wpfr> | ||
| - | * [[http:// | + | * [[https:// |
| - | * [[http:// | + | * < |
| + | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| - | * [[http://dev.deluge-torrent.org/wiki/UserGuide/Service/ | + | * [[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) |
| ---- | ---- | ||
| // | // | ||
