Exécuter le script toutes les 30 minutes avec systemd

20

Je voudrais exécuter un script toutes les 30 minutes après le démarrage du système. Je sais que vous pouvez utiliser cron, mais je ne prévois pas d'utiliser cette fonctionnalité souvent, donc j'aimerais l'essayer avec systemd.

Jusqu'à présent, je n'ai trouvé que les timers monotones qui permettent d'exécuter quelque chose une fois (du moins je pense). À quoi ressemblerait le foo.timeret [email protected]au cas où je souhaiterais exécuter quelque chose toutes les 30 minutes à partir du démarrage / démarrage du système?

[email protected]

[Unit]
Description=run foo
Wants=foo.timer

[Service]
User=%I
Type=simple
ExecStart=/bin/bash /home/user/script.sh

foo.timer

[Unit]
Description=run foo

[Timer]
where I am stuck... ???
TomTom
la source

Réponses:

26

Vous devez créer deux fichiers: un pour le service, l'autre pour la minuterie du même nom.

exemple:

/etc/systemd/system/test.service

[Unit]
Description=test job

[Service]
Type=oneshot
ExecStart=/bin/bash /tmp/1.sh

/etc/systemd/system/test.timer

[Unit]
Description=test

[Timer]
OnUnitActiveSec=10s
OnBootSec=10s

[Install]
WantedBy=timers.target

après cela, rechargez la commande systemd using systemctl daemon-reloadet démarrez votre minuteur par systemctl start test.timer, ou activez-les par défaut.

tester le contenu de 1.sh

#!/bin/bash
echo `date` >> /tmp/2

Et commande pour vérifier tous les temporisateurs disponibles: systemctl list-timers --all

Informations plus détaillées sur la page du projet et exemples sur la page ArchLinux

Reishin
la source
systemd accepte les scripts et il est répertorié, mais rien ne se passe
TomTom
laquelle? il devrait y avoir deux scripts, un minuteur et un autre service. Heure, quand ils ont été exécutés pourraient être vérifiés par la commande list-timers, les erreurs possibles pourraient être vérifiées par systemctl status test.timeret systemctl status test.servicecomamand
Reishin
1
veuillez utiliser la systemctl list-timers --allcommande et vérifier la sortie. Il doit être comme ça . Regardez les colonnes unité, gauche et passée. Si le minuteur est présent, veuillez consulter votre fichier de service et vérifier s'il y a des bogues car le minuteur fonctionne normalement.
Reishin
1
non, la question principale de coz ne demande rien sur "notifier-envoyer" et je pense que nous ne devrions pas mélanger deux choses différentes lorsqu'un tel sujet est déjà présent. dans votre cas, essayez d'ajouter export DISPLAY=:0.0au script.
Reishin
1
ps: selon man systemd.timer, Persistent = true n'a d'effet que sur configuré avec OnCalendar (ie wallclock)
snyh
11

Voici une autre option sans utiliser votre minuterie. Si le timing n'est pas terriblement critique et que le script n'est pas long, ce sera parfait pour les choses simples.

[Unit]
Description=Run foo

[Service]
User=%I
Restart=always
RestartSec=1800s
ExecStart=/bin/bash /home/user/script.sh
Matt H
la source
2
J'aime cette solution. Le seul inconvénient majeur est que les journaux système seront inondés de journaux «Démarrage de <service X>» si vous redémarrez souvent (c'est-à-dire toutes les 30 secondes). À ce stade, il peut être préférable d'exécuter le service en tant que démon à la place, au lieu de redémarrer le service à plusieurs reprises à partir de systemd.
Jersey Bean
C'est vrai. Pour des trucs rapides et simples, cela fonctionne. Mais la minuterie ou un script de longue durée serait une meilleure solution.
Matt H