Démarrer / arrêter un service systemd. à des moments spécifiques

14

Je veux démarrer et arrêter un systemd.service à des moments précis. Je vais probablement utiliser une unité .timer pour démarrer le travail, mais existe-t-il un moyen intégré pour arrêter le travail après une durée spécifique, ou à une heure spécifique , ou dois-je créer une deuxième unité .timer qui exécute le stop?

Merci

Jamie Kitson
la source

Réponses:

6

Pour arrêter un service A avec une minuterie, vous pouvez créer un service B de type avec oneshotlequel il sera en conflit , puis utiliser une minuterie pour démarrer le service B.

Si une unité a un paramètre Conflicts = sur une autre unité, le démarrage de la première arrêtera la seconde et vice versa. ( source )

Un service:

[Unit]
Conflicts=B.service
...

B. service:

[Unit]
Description=B service description

[Service]
Type=oneshot
ExecStart=/bin/echo ''

B. minuterie:

[Timer]
AccuracySec=1
OnActiveSec=10

[Install]
WantedBy=timers.target

Ce qui suit arrêtera le service A après 10 secondes.

systemctl start A.service
systemctl start B.timer
Radivarig
la source
2

Il existe en effet un autre moyen d'arrêter un service après un certain runtime configuré dans le .servicefichier.

RuntimeMaxSec=...

Vous n'aimez peut-être pas le fait que le service soit considéré comme ayant échoué, mais c'est un résultat plus ou moins logique de la suppression d'un service de longue durée.

Pour obtenir une meilleure réponse, vous souhaiterez peut-être expliquer pourquoi vous utilisez une fonctionnalité aussi inhabituelle. Les services sont généralement destinés à fonctionner indéfiniment ou jusqu'à ce qu'ils soient explicitement arrêtés, pas seulement pendant une durée fixe.

Pavel Šimerda
la source
1
Oui, nous avons discuté de cela et de ses limites sur la liste de diffusion: lists.freedesktop.org/archives/systemd-devel/2016-April/…
Jamie Kitson
1
Pas inhabituel. Qu'en est-il de l'exécution d'un service exigeant en ressources, peut-être SETI, la nuit uniquement, lorsque le serveur reçoit le moins de trafic. De plus, là où je travaille, nous avons un démon d'alerte conçu pour réveiller l'équipe d'assistance via leurs téléphones lorsqu'il y a une exception sur les serveurs. Nous ne voulons vraiment pas que cette chose ennuyeuse soit exécutée lorsque nous sommes réellement éveillés, car ces serveurs ont des problèmes à gauche et à droite pendant une utilisation maximale.
James M. Lay
0

Vous pouvez utiliser quelques tâches cron:

 # ┌───────────── min (0 - 59) 
 # │ ┌────────────── heure (0 - 23)
 # │ │ ┌─────────────── jour du mois (1 - 31)
 # │ │ │ ┌──────────────── mois (1-12)
 # │ │ │ │ ┌───────────────── Jour de la semaine (0 - 6)
 # │ │ │ │ │
 # │ │ │ │ │
   * * * * * systemctl start $ SERVICE.service
   * * * * * systemctl stop $ SERVICE.service

Plus d'informations sur cron: https://en.wikipedia.org/wiki/Cron , https://wiki.archlinux.org/index.php/Cron

John Moon
la source
8
Comment un travail cron est-il une amélioration par rapport aux .timerunités systemd que OP connaît déjà?
Pavel Šimerda
Je pourrais, oui, mais ma question est vraiment de savoir comment le faire correctement avec systemd? Je suppose qu'il doit y avoir un moyen standard d'arrêter un emploi à un moment précis ou après une certaine durée.
Jamie Kitson
@JamieKitson Pour être honnête, je ne pense pas qu'il y ait réellement besoin d'une telle fonctionnalité au-delà des temporisateurs cron et systemd. La plupart des installations de systemd n'utiliseront jamais de telles fonctionnalités et il n'y a rien de mal à exécuter en systemctlutilisant cron, des minuteries systemd et tout ce que vous voulez. À mon avis, cette réponse est aussi valable que toute autre réponse.
Pavel Šimerda
comment autorisez-vous par exemple à www-data à exécuter systemctl start & stop?
alvaropgl
@alvaropgl Votre commentaire n'a rien à voir avec les utilisateurs (www-data) et quel accès limité ils peuvent avoir pour exécuter / ne pas exécuter les processus (systemctl), qui est le sujet. S'il vous plaît commencer un nouveau sujet. Astuce: vous voulez probablement envisager de créer une API pour faire les choses que vous voulez, plutôt que votre approche actuelle consistant à permettre plus de responsabilité + de portée à l'utilisateur www-data.
Scott Prive