Différences entre versions de « Systemctl service »
(Page créée avec « = Introduction = Dans cet article nous allons créer un service, très simplement, avec '''Systemctl'''. Pour cela, nous allons d'abord utiliser PHP pour ''fabriquer'' n… ») |
|||
(18 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 9 : | Ligne 9 : | ||
Dans le dossier ''/opt/php-service'' nous allons créer le fichier clock.php : | Dans le dossier ''/opt/php-service'' nous allons créer le fichier clock.php : | ||
− | < | + | |
+ | <syntaxhighlight lang="php"> | ||
<?php | <?php | ||
Ligne 18 : | Ligne 19 : | ||
sleep(2); | sleep(2); | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
Le but de ce programme est d'écrire, toutes les 2 secondes, la date dans le fichier ''/tmp/clock.log''. | Le but de ce programme est d'écrire, toutes les 2 secondes, la date dans le fichier ''/tmp/clock.log''. | ||
Ligne 41 : | Ligne 42 : | ||
== Préparation pour devenir un service == | == Préparation pour devenir un service == | ||
+ | === shebang=== | ||
Nous pourrions utiliser PHP à chaque fois que l'on veut invoquer notre service mais on va plutôt ajouter le [https://fr.wikipedia.org/wiki/Shebang shebang] à la première ligne de notre fichier ''clock.php'' : | Nous pourrions utiliser PHP à chaque fois que l'on veut invoquer notre service mais on va plutôt ajouter le [https://fr.wikipedia.org/wiki/Shebang shebang] à la première ligne de notre fichier ''clock.php'' : | ||
<pre> | <pre> | ||
Ligne 49 : | Ligne 51 : | ||
# whereis php | # whereis php | ||
php: /usr/bin/php /usr/lib64/php /usr/share/php /usr/share/man/man1/php.1.gz | php: /usr/bin/php /usr/lib64/php /usr/share/php /usr/share/man/man1/php.1.gz | ||
+ | </pre> | ||
+ | === Droit d'exécution === | ||
+ | Maintenant que nous avons ajouté le shebang, ''bash'' va savoir comment exécuter notre programme et il ne nous reste plus qu'a modifier ses droits pour le rendre exécutable : | ||
+ | <pre> | ||
+ | # chmod +x clock.php | ||
+ | </pre> | ||
+ | On peut maintenant exécuter notre programme ainsi : | ||
+ | <pre> | ||
+ | # ./clock.php | ||
+ | </pre> | ||
+ | === Ajout dans le path === | ||
+ | Pour reproduire le même comportement que les autres programmes, il est possible d'ajouter notre programme au path pour pouvoir l'appeler grâce à l’autocomplétion. Pour cela, nous allons ajouter un lien symbolique dans le répertoire ''/usr/bin/'' : | ||
+ | <pre> | ||
+ | # ln -fs /opt/php-service/clock.php /usr/bin/clock-php | ||
+ | </pre> | ||
+ | Le programme clock existant déjà, on rajoute ''-php'' à la fin pour ne pas écraser le programme original :). Si votre programme possède un nom unique sur le système, vous n'avez pas besoin de faire ça ! | ||
+ | |||
+ | Maintenant de n'importe où on peut utiliser l'autocomplétion pour appeler notre programme : | ||
+ | <pre> | ||
+ | # clock-php | ||
+ | </pre> | ||
+ | Et même demander à whereis où il se trouve : | ||
+ | <pre> | ||
+ | # whereis clock-php | ||
+ | clock-php: /usr/bin/clock-php | ||
+ | </pre> | ||
+ | Nice ! | ||
+ | === Création d'un utilisateur et un groupe === | ||
+ | Pour des raisons de sécurité, il est préférable que le programme ne tourne pas en tant que ''root'' mais en tant que simple utilisateur. | ||
+ | |||
+ | Puis un utilisateur un peu spécial, qui ne peut pas se connecter et qui n'a pas de répertoire ''home'' : | ||
+ | <pre> | ||
+ | # useradd -r -s /sbin/nologin clock-php | ||
+ | </pre> | ||
+ | Notez que l'option ''-r'' créer un utilisateur système, c'est à dire qui n'a pas de répertoire ''home'' mais, cela s'occupe également de la création du groupe associé (clock-php) et ajoute l'utilisateur dans ce groupe ! | ||
+ | |||
+ | = Fichier de service systemd = | ||
+ | == Création == | ||
+ | Maintenant que notre programme ressemble à un ''vrai'' programme, nous pouvons créer un fichier ''.service'' pour demander à systemd de s'en occuper. | ||
+ | |||
+ | Nous allons créer le fichier ''clock-php.service'' dans le même répertoire que le programme pour des raison de simplicité : | ||
+ | <pre> | ||
+ | [Unit] | ||
+ | Description=clock-php daemon service | ||
+ | After=network-online.target | ||
+ | |||
+ | [Service] | ||
+ | Type=simple | ||
+ | |||
+ | User=clock-php | ||
+ | Group=clock-php | ||
+ | UMask=007 | ||
+ | |||
+ | ExecStart=/usr/bin/clock-php | ||
+ | |||
+ | Restart=on-failure | ||
+ | |||
+ | TimeoutStopSec=300 | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=multi-user.target | ||
+ | </pre> | ||
+ | |||
+ | == Explications == | ||
+ | |||
+ | {|class="wikitable" width="85%" | ||
+ | |- | ||
+ | || Section || Directive || Description | ||
+ | |- | ||
+ | || Unit || Description || la description qui apparait avec la commande ''systemctl status clock-php'' | ||
+ | |- | ||
+ | || Unit || After || Nom de la cible après laquelle le service doit être démarré (et avant laquelle il doit être stoppé). Si vous voulez la liste exhaustive de toutes les cibles : ''systemctl list-units --type target'' | ||
+ | |- | ||
+ | || Service || Type || Type de notre service, peut notamment prendre les valeurs suivante : | ||
+ | * simple → systemd considère que le service démarre de suite (notre cas de figure) | ||
+ | * forking → systemd attend que le processus soit détaché du contexte d'exécution courant et que le processus père ait rendu la main (soit terminé). Utile si on avait fait un fork comme mentionné dans [[Php daemon | cet article]]. Dans ce cas de figure il est intéressant de préciser le fichier de pid avec la directive '''PIDFile=''' | ||
+ | * oneshot → utile pour des script qui font un travail et rendent la main. Vous pouvez maintenir l'état du service avec la directive '''RemainAfterExit=yes''' pour que systemd considère le service comme actif après l'exécution du script. | ||
+ | * ... | ||
+ | |- | ||
+ | || Service || User || l'utilisateur utilisé pour l'abaissement de privilège | ||
+ | |- | ||
+ | || Service || Group || le groupe utilisé pour l'abaissement de privilège | ||
+ | |- | ||
+ | || Service || Umask || le masque utilisé pour la création de fichiers | ||
+ | |- | ||
+ | || Service || ExecStart || Le chemin de l'exécutable | ||
+ | |- | ||
+ | || Service || Restart || précise quand redémarrer le service : | ||
+ | * on-failure → quand le service échoue (code retour différent de zéro) | ||
+ | * always → dès que le service se termine indépendamment du code retour. C'est utile si vous n'avez pas de boucle qui retient le programme (while ou autre) | ||
+ | |- | ||
+ | || Service || TimeoutStopSec || temps laissé au programme pour s’arrêter avant de le tuer (SIGKILL) | ||
+ | |- | ||
+ | || Install || WantedBy || le niveau de démarrage du système dans lequel appelé le programme. Je vous laisse voir cette article à propos des [[Systemctl#Aper.C3.A7u | niveau de démarrage]] mais pour faire simple : | ||
+ | * multi-user.target → ligne de commande | ||
+ | * graphical.target → interface graphique | ||
+ | |} | ||
+ | |||
+ | == Lien symbolique et activation == | ||
+ | Maintenant que le fichier existe, nous allons créer un lien symbolique dans le répertoire ''/etc/systemd/system'': | ||
+ | <pre> | ||
+ | # ln -fs /opt/php-service/clock-php.service /etc/systemd/system/ | ||
+ | </pre> | ||
+ | Puis redémarrer la partie service de systemd : | ||
+ | <pre> | ||
+ | systemctl daemon-reload | ||
+ | </pre> | ||
+ | |||
+ | == Utilisation == | ||
+ | On peut maintenant utiliser le service avec les commandes traditionnelle : | ||
+ | * start | ||
+ | * stop | ||
+ | * status | ||
+ | * ... | ||
+ | Vous avez tous les détails sur systemd dans [[Systemctl | cet article]] mais pour résumer : | ||
+ | *On démarre donc le service avec : | ||
+ | <pre> | ||
+ | # systemctl start clock-php | ||
+ | </pre> | ||
+ | *On vérifie le status du service avec : | ||
+ | <pre> | ||
+ | # systemctl status clock-php | ||
+ | ● clock-php.service - clock-php daemon service | ||
+ | Loaded: loaded (/etc/systemd/system/clock-php.service; alias) | ||
+ | Active: active (running) since Sat 2024-05-18 01:07:46 CEST; 1s ago | ||
+ | Main PID: 1487 (clock-php) | ||
+ | Tasks: 1 (limit: 5904) | ||
+ | Memory: 8.6M | ||
+ | CPU: 27ms | ||
+ | CGroup: /system.slice/clock-php.service | ||
+ | └─1487 /usr/bin/php /usr/bin/clock-php | ||
+ | |||
+ | May 18 01:07:46 prog systemd[1]: Started clock-php daemon service. | ||
+ | </pre> | ||
+ | *On peut même enregistrer le service au démarrage : | ||
+ | <pre> | ||
+ | # systemctl enable clock-php | ||
+ | Created symlink /etc/systemd/system/multi-user.target.wants/clock-php.service → /opt/php-service/clock-php.service. | ||
</pre> | </pre> |
Version actuelle datée du 26 novembre 2024 à 17:42
Introduction
Dans cet article nous allons créer un service, très simplement, avec Systemctl.
Pour cela, nous allons d'abord utiliser PHP pour fabriquer notre service, puis nous allons créer un fichier service pour automatiser son démarrage !
Le programme
Création
Le service que nous allons faire va simplement écrire le temps unix dans un fichier de journalisation pour que, une fois démarré et passé en tâche de fond, nous puissions nous assurer qu'il tourne toujours !
Dans le dossier /opt/php-service nous allons créer le fichier clock.php :
<?php
define("LOG_FILE", "/tmp/clock.log");
while(1){
file_put_contents(LOG_FILE, time()."\n", FILE_APPEND);
sleep(2);
}
Le but de ce programme est d'écrire, toutes les 2 secondes, la date dans le fichier /tmp/clock.log.
Pas un démon
On peut remarquer que ce n'est même pas un démon et qu'il ne rend pas la main lorsque nous allons l’exécuter. D’ailleurs il n'utilise aucune des fonctions décrites dans cet article car nous allons demander à SystemD de s'occuper de tout.
Test sans SystemD
Nous allons tester ce programme :
# php clock.php
Puis dans un autre terminal, nous pouvons faire :
# tail -f /tmp/clock.php 1715971610 1715971612 1715971614 1715971616 ...
Préparation pour devenir un service
shebang
Nous pourrions utiliser PHP à chaque fois que l'on veut invoquer notre service mais on va plutôt ajouter le shebang à la première ligne de notre fichier clock.php :
#!/usr/bin/php
Le dossier de l'exécutable de PHP peut changer en fonction des distributions Linux et, si vous avez un doute, n'hésitez pas à utiliser la commande whereis :
# whereis php php: /usr/bin/php /usr/lib64/php /usr/share/php /usr/share/man/man1/php.1.gz
Droit d'exécution
Maintenant que nous avons ajouté le shebang, bash va savoir comment exécuter notre programme et il ne nous reste plus qu'a modifier ses droits pour le rendre exécutable :
# chmod +x clock.php
On peut maintenant exécuter notre programme ainsi :
# ./clock.php
Ajout dans le path
Pour reproduire le même comportement que les autres programmes, il est possible d'ajouter notre programme au path pour pouvoir l'appeler grâce à l’autocomplétion. Pour cela, nous allons ajouter un lien symbolique dans le répertoire /usr/bin/ :
# ln -fs /opt/php-service/clock.php /usr/bin/clock-php
Le programme clock existant déjà, on rajoute -php à la fin pour ne pas écraser le programme original :). Si votre programme possède un nom unique sur le système, vous n'avez pas besoin de faire ça !
Maintenant de n'importe où on peut utiliser l'autocomplétion pour appeler notre programme :
# clock-php
Et même demander à whereis où il se trouve :
# whereis clock-php clock-php: /usr/bin/clock-php
Nice !
Création d'un utilisateur et un groupe
Pour des raisons de sécurité, il est préférable que le programme ne tourne pas en tant que root mais en tant que simple utilisateur.
Puis un utilisateur un peu spécial, qui ne peut pas se connecter et qui n'a pas de répertoire home :
# useradd -r -s /sbin/nologin clock-php
Notez que l'option -r créer un utilisateur système, c'est à dire qui n'a pas de répertoire home mais, cela s'occupe également de la création du groupe associé (clock-php) et ajoute l'utilisateur dans ce groupe !
Fichier de service systemd
Création
Maintenant que notre programme ressemble à un vrai programme, nous pouvons créer un fichier .service pour demander à systemd de s'en occuper.
Nous allons créer le fichier clock-php.service dans le même répertoire que le programme pour des raison de simplicité :
[Unit] Description=clock-php daemon service After=network-online.target [Service] Type=simple User=clock-php Group=clock-php UMask=007 ExecStart=/usr/bin/clock-php Restart=on-failure TimeoutStopSec=300 [Install] WantedBy=multi-user.target
Explications
Section | Directive | Description |
Unit | Description | la description qui apparait avec la commande systemctl status clock-php |
Unit | After | Nom de la cible après laquelle le service doit être démarré (et avant laquelle il doit être stoppé). Si vous voulez la liste exhaustive de toutes les cibles : systemctl list-units --type target |
Service | Type | Type de notre service, peut notamment prendre les valeurs suivante :
|
Service | User | l'utilisateur utilisé pour l'abaissement de privilège |
Service | Group | le groupe utilisé pour l'abaissement de privilège |
Service | Umask | le masque utilisé pour la création de fichiers |
Service | ExecStart | Le chemin de l'exécutable |
Service | Restart | précise quand redémarrer le service :
|
Service | TimeoutStopSec | temps laissé au programme pour s’arrêter avant de le tuer (SIGKILL) |
Install | WantedBy | le niveau de démarrage du système dans lequel appelé le programme. Je vous laisse voir cette article à propos des niveau de démarrage mais pour faire simple :
|
Lien symbolique et activation
Maintenant que le fichier existe, nous allons créer un lien symbolique dans le répertoire /etc/systemd/system:
# ln -fs /opt/php-service/clock-php.service /etc/systemd/system/
Puis redémarrer la partie service de systemd :
systemctl daemon-reload
Utilisation
On peut maintenant utiliser le service avec les commandes traditionnelle :
- start
- stop
- status
- ...
Vous avez tous les détails sur systemd dans cet article mais pour résumer :
- On démarre donc le service avec :
# systemctl start clock-php
- On vérifie le status du service avec :
# systemctl status clock-php ● clock-php.service - clock-php daemon service Loaded: loaded (/etc/systemd/system/clock-php.service; alias) Active: active (running) since Sat 2024-05-18 01:07:46 CEST; 1s ago Main PID: 1487 (clock-php) Tasks: 1 (limit: 5904) Memory: 8.6M CPU: 27ms CGroup: /system.slice/clock-php.service └─1487 /usr/bin/php /usr/bin/clock-php May 18 01:07:46 prog systemd[1]: Started clock-php daemon service.
- On peut même enregistrer le service au démarrage :
# systemctl enable clock-php Created symlink /etc/systemd/system/multi-user.target.wants/clock-php.service → /opt/php-service/clock-php.service.