Comment utiliser systemd pour lancer des programmes au démarrage sur Raspberry Pi

Raspberry Pi est un puissant SBC (ordinateur monocarte) que vous pouvez utiliser pour diverses applications et projets. Sa polyvalence réside dans sa capacité à exécuter toutes sortes de programmes, y compris des scripts personnalisés, en partie grâce au système d'exploitation Raspberry Pi et aux autres systèmes d'exploitation basés sur Linux qu'il exécute.

Exécuter un script ou un programme sur le Raspberry Pi est aussi simple que de le trouver sur le système et de l'exécuter. Mais que se passe-t-il si vous souhaitez automatiser ce processus, peut-être parce que votre projet l'exige ou parce que vous souhaitez rationaliser votre flux de travail?

Une réponse à cela est d'apprendre à utiliser systemd.

Qu'est-ce que Systemd?

systemd est une suite de composants système pour la configuration et le comportement des services sur les systèmes Linux modernes. Il est identifié par un PID (identifiant de processus) de 1 car c'est le premier processus à démarrer au démarrage du système. Dans l'ensemble, le but de systemd est de vous aider à gérer et à exécuter des programmes au démarrage du système. Et c'est ce que vous utiliserez pour lancer votre programme au démarrage sur le Pi.

Comme mentionné initialement, il existe plusieurs méthodes pour exécuter des programmes au démarrage sur des systèmes Linux, tels que rc.local, cron et autostart. Cependant, systemd arrive à une meilleure solution du lot si vous souhaitez lancer des programmes GUI (interface utilisateur graphique), automatiser les applications à exécuter après le début de certains processus système ou exécuter des programmes encore et encore jusqu'à ce que votre planification fonctionne.

Connexes: Comment planifier des tâches sous Linux avec Cron et Crontab

Comment utiliser systemd pour lancer des programmes au démarrage

systemd est une méthode légèrement plus compliquée de lancement de programmes au démarrage sur des systèmes Linux. Cependant, la flexibilité de planification qu'elle offre par rapport aux autres méthodes – celles que nous avons mentionnées ci-dessus – l'emporte totalement sur sa complexité dans tous les aspects.

La méthode systemd utilise des fichiers d'unité, qui sont un peu comme des fichiers .ini qui contiennent des informations de codage sur les périphériques, les services, les sockets, la cible de démarrage et d'autres composants système essentiels.

Les fichiers d'unité sont de différents types. Ainsi, en fonction du type de ressource que vous souhaitez déclarer, vous devez choisir un type de fichier unitaire en conséquence. Pour les besoins de ce guide, cependant, nous nous en tiendrons aux fichiers d'unité .service, qui vous permettent de gérer le comportement de démarrage des programmes et des scripts sur le système.

Vous trouverez ci-dessous une description des étapes du lancement d'un script / programme au démarrage à l'aide de systemd.

Créer un service

Pour configurer votre programme pour qu'il s'exécute au démarrage, créez un fichier d'unité de service qui indiquera à systemd quel programme exécuter et quand. Voici comment procéder.

  1. Dans la fenêtre CLI, saisissez sudo nano /lib/systemd/system/display.service . Vous pouvez utiliser n'importe quel nom pour votre service tant qu'il se termine par l'extension .service.
  2. Dans le fichier de service, collez les lignes de code suivantes:
     [Unit]
    Description=PiCounter
    After=network.target
    [Service]
    ExecStart=/usr/bin/python3 /home/pi/PiCounter/display.py
    Restart=always
    User=pi
    [Install]
    WantedBy=multi-user.target

Toutes vos options de configuration courantes relèvent des sections Unité et Installation , tandis que les options de configuration spécifiques au service se trouvent dans la section Service.

Voici quelques-unes des paires directive-valeur ci-dessus que vous devrez peut-être modifier:

je. Après: il détermine quand démarrer le service. Le paramétrer sur network.target garantit que la valeur répertoriée – network.target dans ce cas – démarre avant de commencer l'unité en cours. Cependant, il ne dirige pas une relation de dépendance pour le service à déclencher; cela se fait via d'autres directives telles que Wants, Requiert et WantedBy.

Bien entendu, vous pouvez modifier cette valeur en fonction des exigences de votre projet. Par exemple, si vous souhaitez que votre programme s'exécute après la connexion de votre Raspberry Pi à un réseau, vous pouvez utiliser la valeur network-online.target . Vous pouvez vous référer à la documentation de Fedora sur systemd pour en savoir plus sur ces valeurs.

ii. ExecStart: il contient le chemin absolu et le nom du programme / script que vous souhaitez exécuter au démarrage. Ainsi, en fonction de ce que vous souhaitez exécuter, vous devez ajouter des valeurs pour ces deux directives.

iii. Utilisateur: il identifie le nom de votre Raspberry Pi. Si vous avez changé le nom de votre Pi, vous devez mettre cette valeur pour l'utilisateur.

iv. WantedBy: C'est la manière la plus courante de spécifier le déclencheur d'une unité. En le définissant sur multi-user.target , vous pouvez établir une relation de dépendance qui exécutera le programme lorsque le contrôle du système sera transféré au shell multi-utilisateur.

De plus, cela exécute également votre programme avant le démarrage du système X-Windows de Pi, ce qui signifie que votre programme s'exécute avant même que vous vous connectiez au système. Si vous souhaitez qu'un script s'exécute avant de vous connecter à votre Raspberry Pi, cela vous permet de le faire.

Les lignes de code ci-dessus fonctionnent pour les programmes non-GUI. Cependant, si vous souhaitez exécuter un programme GUI à l'aide de systemd, vous devez ajouter le code suivant à votre fichier de service:

 [Unit]
Description=PiCounter
After=network.target
[Service]
Environment=Display=:0
Environment=XAUTHORITY/home/pi/.Xauthority
ExecStart=/usr/bin/python3 /home/pi/PiCounter/display.py
Restart=always
[Install]
WantedBy=multi-user.target

Dans la paire directive-valeur ci-dessus, tout ce que vous devez modifier est la valeur de la directive ExecStart . Remplacez celui du bloc de code par le programme que vous souhaitez exécuter au démarrage. Après avoir rempli le fichier de service, appuyez sur CTRL + O pour l'enregistrer.

Testez le service

Avec le service prêt, vérifiez manuellement s'il fonctionne. Pour cela, tapez la commande suivante dans le terminal: sudo systemctl start display.service . Le service doit exécuter vos instructions avec succès.

Une fois que c'est fait, terminez-le avec sudo systemctl stop display.service .

Activer le service

Si vous avez réussi à exécuter votre programme avec succès en utilisant le service, il est temps de l'activer afin qu'il exécute votre programme automatiquement chaque fois que vous démarrez votre Raspberry Pi.

Pour ce faire, tapez sudo systemctl enable display.service dans la fenêtre du terminal. Et une fois que cela est fait, entrez sudo reboot pour redémarrer votre Pi.

Une fois que votre Raspberry Pi démarre, systemd doit exécuter votre programme selon les instructions fournies.

Automatiser le lancement du programme au démarrage sur Raspberry Pi

Comme la plupart des systèmes Linux, le système d'exploitation Raspberry Pi vous permet également d'accomplir des opérations de plusieurs manières, et il reste également fidèle à la planification des lancements de programmes. Donc, si vous voulez lancer des programmes / scripts GUI au démarrage et que vous voulez un meilleur contrôle sur votre planification, systemd est clairement une meilleure méthode.

Cela dit, si vous souhaitez une solution plus simple ou si les exigences de votre projet nécessitent une planification spécifique, vous pouvez consulter notre guide Exécution d'un programme ou d'un script Raspberry Pi au démarrage pour en savoir plus.