User Tools

Site Tools


howto:systemd-service

Utiliser systemd pour démarrer un service Linux au démarrage

systemd est un outil système Linux initialement développé par l'équipe Red Hat Linux. Il comprend de nombreuses fonctionnalités, notamment un système d'amorçage utilisé pour démarrer et gérer les processus système. Il s'agit actuellement du système d'initialisation par défaut sur la plupart des distributions Linux. De nombreux outils logiciels couramment utilisés, tels que SSH et Apache, sont livrés avec un service systemd.

Il est simple de créer un service systemd personnalisé qui exécutera n’importe quel script ou processus de votre choix. Bien qu'il existe plusieurs façons d'exécuter un script ou de démarrer un processus au démarrage de votre Linode, un service systemd personnalisé facilite le démarrage, l'arrêt ou le redémarrage de votre script, ainsi que sa configuration pour qu'il démarre automatiquement au démarrage. systemd offre l'avantage d'utiliser une interface standardisée et cohérente dans toutes les distributions Linux qui la prennent en charge.

Créer un service systemd personnalisé

Créer un script ou un exécutable que le service gérera, par exemple un simple script Bash test_service.sh :

DATE=`date '+%Y-%m-%d %H:%M:%S'` echo "Example service started at ${DATE}" | systemd-cat -p info while : do echo "Looping..."; sleep 30; done

Ce script enregistrera l'heure à laquelle il est initialisé, puis bouclera à l'infini pour maintenir le service en marche.

Copier le script dans /usr/bin et le rendre exécutable :

sudo cp test_service.sh /usr/bin/test_service.sh
sudo chmod +x /usr/bin/test_service.sh

Créer un fichier Unit /lib/systemd/system/myservice.service pour définir un service systemd :

        [Unit]
        Description=Exemple de service systemd.

        [Service]
        Type=simple
        ExecStart=/bin/bash /usr/bin/test_service.sh

        [Install]
        WantedBy=multi-user.target

Cela définit un service simple. La partie critique est la directive ExecStart, qui spécifie la commande qui sera exécutée pour démarrer le service.

Copier le fichier d'unité dans /etc/systemd/system et lui accorder les autorisations :

sudo cp monservice.service /etc/systemd/system/myservice.service
sudo chmod 644 /etc/systemd/system/myservice.service

Démarrer et activer le service

Une fois que l'on dispose d’un fichier unité, on peut tester le service :

sudo systemctl start myservice

Vérifier l'état du service :

sudo systemctl status myservice

Si le service fonctionne correctement, le résultat doit ressembler à ce qui suit :

    ● myservice.service - Example systemd service.
       Loaded: loaded (/lib/systemd/system/myservice.service; enabled; vendor preset: enabled)
       Active: active (running) since Tue 2018-05-01 18:17:14 UTC; 4s ago
     Main PID: 16266 (bash)
        Tasks: 2
       Memory: 748.0K
          CPU: 4ms
       CGroup: /system.slice/myservice.service
               ├─16266 /bin/bash /usr/bin/test_service.sh
               └─16270 sleep 30

    May 01 18:17:14 localhost systemd[1]: Started Example systemd service..
    May 01 18:17:14 localhost cat[16269]: Example service started at 2018-05-01 18:17:14
    May 01 18:17:14 localhost bash[16266]: Looping...

Le service peut être arrêté ou redémarré à l'aide des commandes systemd standard :

sudo systemctl stop myservice
sudo systemctl restart myservice
 Enfin, utilisez la commande **enable** pour que le service démarre à chaque démarrage du système :
sudo systemctl enable myservice

Un lien symbolique sera créé à partir de /etc/systemd/system/multi-user.target.wants/myservice.service vers /lib/systemd/system/myservice.service.

Redémarrer et vérifier l'état du service :

sudo systemctl statut mon service

On doit voir que le service a enregistré son heure de démarrage immédiatement après le démarrage :

    ● myservice.service - Example systemd service.
       Loaded: loaded (/usr/lib/systemd/system/myservice.service; enabled; vendor preset: disabled)
       Active: active (running) since Wed 2018-05-02 15:03:07 UTC; 48s ago
     Main PID: 2973 (bash)
       CGroup: /system.slice/myservice.service
               ├─2973 /bin/bash /usr/bin/test_service.sh
               └─3371 sleep 30

    May 02 15:03:07 localhost systemd[1]: Started Example systemd service..
    May 02 15:03:07 localhost systemd[1]: Starting Example systemd service....
    May 02 15:03:07 localhost bash[2973]: Looping...
    May 02 15:03:37 localhost bash[2973]: Looping...

Dépannage

La ligne « Exemple de service démarré à … » n'apparaît pas dans la sortie de la commande status. La sortie systemd-cat n'est pas fiable en raison d'une condition de concurrence critique. Pour contourner ce problème, mettre à jour le fichier test_service.sh comme suit :

        info=/tmp/myservice-systemd-cat-pipe-info
        mkfifo "$info"
        trap "exec 3>&-; rm $info" EXIT
        systemd-cat -p info < "$info" &
        exec 3>"$info"

        DATE=`date '+%Y-%m-%d %H:%M:%S'`
        echo "Example service started at ${DATE}" > "$info"

        while :
        do
        echo "Looping...";
        sleep 30;
        done
howto/systemd-service.txt · Last modified: 2025/02/19 10:59 by 127.0.0.1