Parfois, nous devons redémarrer les services systemd pour résoudre les erreurs opérationnelles. Nous pouvons automatiser cela en utilisant différentes méthodes sous Linux. Dans ce tutoriel, nous examinerons trois façons de redémarrer périodiquement un service systemd.

Utilisation d’un service Oneshot

Les services Oneshot sont des services systemd qui effectuent une tâche spécifique et se terminent à la fin de cette tâche. En d’autres termes, le processus est de courte durée. Nous pouvons démarrer périodiquement un service systemd à l’aide d’une minuterie et d’un service oneshot. Nous utiliserons le service de minuterie pour déclencher le service oneshot. Par la suite, le service oneshot sera responsable du redémarrage de notre service systemd.

Nous créons tous les fichiers d’unité de service systemd dans le répertoire /etc/systemd/system. Nous créons trois fichiers d’unité systemd appelés my-service.service, oneshot.service, et mon-service.minuterie. Définissons un service appelé my-service.service, qui effectuera une tâche spécifique:

su sudo vi mon service.service
[Unité]
Description = Service simple

[Service]
Type = simple
ExecStart =/usr/bin/enregistreur bonjour

[Installer]
WantedBy = multi-utilisateurs.cible

Ce service fera une entrée simple dans le journal système. Dans notre cas, nous enregistrons le message “bonjour“. Par conséquent, nous devrions voir la sortie “bonjour” dans nos journaux une fois le service exécuté. Par la suite, créons le unchaud.fichier de service:

su sudo vi oneshot.service
[Unité]
Description = Service unique

[Service]
Type = oneshot
ExecStart =/usr/bin/systemctl redémarrez mon service.service

[Installer]
WantedBy = multi-utilisateurs.cible

Le coup.le fichier de service redémarrera my-service.service. Enfin, nous avons mis en place la minuterie systemd:

su sudo vi mon service.minuterie
[Unité]
Description = Exécuter le service oneshot périodiquement

[Minuterie]
Unité = unchaud.service
Oncalendaire = Lun..Mon 10:30

[Installer]
WantedBy = minuteries.cible

Le coup.le fichier de service sera déclenché par la minuterie systemd que nous avons créée. Dans cet exemple, le service systemd mon-service redémarrera à 10h30 en semaine. De plus, nous démarrons la minuterie comme nous démarrerions n’importe quel autre service systemd:

enablesystemctl activernowmaintenant mon service.minuterie

Nous pouvons voir quand le minuteur s’est exécuté et quand il va s’exécuter en listant les minuteries systemd:

tim minuteries de liste systemctl
LA DERNIÈRE UNITÉ PASSÉE À GAUCHE SUIVANTE S’ACTIVE
Ven 2021-12-24 09:39:42 SAST 3min 13s gauche Ven 2021-12-24 08:36:22 SAST il y a 1h 0min dnf-makecache.minuterie dnf – makecache.service
Ven 2021-12-24 10:30:00 SAST 53min gauche Ven 2021-12-24 09:22:03 SAST il y a 14min mon service.minuterie oneshot.service

Après avoir vérifié les journaux système, nous constatons que notre service a bien fonctionné:

journ journalctlsincedepuis « il y a 5 minutes »
Déc 24 10:30:03 hôte local.localdomain systemd [1] : Démarrage du service simple.
Déc 24 10:30:03 hôte local.système de domaine locald [1] : unchaud.service: Réussi.
Déc 24 10:30:03 hôte local.localdomain systemd [1] : Démarrage du service One shot.
Déc 24 10:30:03 hôte local.racine du domaine local [4385] : bonjour
Déc 24 10:30:03 hôte local.localdomain systemd [1] : mon-service.service: Réussi.

Utilisation des options RuntimeMaxSec et Restart

Alternativement, nous pouvons utiliser l’option RuntimeMaxSec pour mettre fin à un service systemd après un certain temps d’exécution. De plus, nous définissons le descripteur de redémarrage sur toujours. Cette option garantit que le service est toujours redémarré. Cette méthode ne fonctionne pas sur les services oneshot. En effet, les services oneshot se terminent toujours à la fin d’une tâche. Ainsi, en utilisant le service my.le fichier d’unité de service ne fonctionnera pas dans ce cas. Créons un service systemd simple et nommons-le my-service1.service:

su sudo vi mon-service1.service
[Unité]
Description = Service simple

[Service]
ExecStart =/usr/bin/python3/root/app.py
Durée d’exécution maximale = 180 secondes
Redémarrer = toujours

[Installer]
WantedBy = multi-utilisateurs.cible

Ce service exécutera un programme python de base qui s’exécute indéfiniment. De plus, ce service se terminera après 180 secondes et redémarrera à nouveau:

24 Déc 18:50:57 localhost systemd [1]: Démarrage du service simple.
24 Déc 18:53:57 systemd localhost [1]: mon-service1.service : Limite de temps d’exécution atteinte par le service. Arrêt.
24 Déc 18:53:57 systemd localhost [1]: mon-service1.service: Échec avec le résultat ‘timeout’.
24 Déc 18:53:57 systemd localhost [1]: mon-service1.service: Service RestartSec = 100 ms expiré, planification du redémarrage.
24 Déc 18:53:57 systemd localhost [1]: mon-service1.service: Travail de redémarrage planifié, le compteur de redémarrage est à 1.
24 Déc 18:53:57 systemd localhost [1]: Arrêt du service simple.
24 Déc 18:53:57 localhost systemd [1]: Démarrage du service simple.

À l’aide d’un Cronjob

Alternativement, nous pouvons spécifier la commande que nous aimerions exécuter dans un crontab au lieu d’un fichier de service. Éditons notre crontab:

cr crontab-e
30 10 * * 1-5 / usr/bin/systemctl redémarrez mon service.service

Ici, notre entrée spécifie que nous voulons redémarrer my-service.service à 10h30 tous les jours de la semaine. De plus, si le service est désactivé, il sera redémarré.

Conclusion

Dans cet article, nous avons exploré différentes techniques qui nous permettent de redémarrer gracieusement les services systemd simples et oneshot.