Utiliser systemd pour les tâches programmées ?

Mais si c’est possible avec la carte kiwi !

Il existe deux sortes de tâches programmées : celles qui s’executent à un temps certain, et celles qui s’executent en réponse à un évènement (par exemple, le démarrage de l’ordinateur).

D’habitude, on utilise crontab pour gérer les tâches récurrentes, mais vu que systemd prend la main partout … autant s’y habituer dès maintenant. L’outil s’appelle systemd.timer, et vous retrouverez ici la documentation.

Dans mon cas, je veux juste programmer une tâche qui lance la commande node app.js toutes les heures.

En langage cron, on aurait simplement une ligne 0 * * * * node app.js. Pas très lisible, à vrai dire, ce serait plus propre avec un script dans /etc/cron.hourly/, mais ce n’est pas la question.

Dans mon cas, et d’après le manuel, il faut que j’utilise OnCalendar. Petit détour par la page annexe qui nous apprend : > The special expressions “minutely”, “hourly”, “daily”, “monthly”, “weekly”, “yearly”, “quarterly”, “semiannually” may be used as calendar events

Parfait ! Je peux donc utiliser OnCalendar=hourly.

Le fonctionnement de systemd impose cependant d’avoir deux fichiers : un service, qui contient la définition du programme, et un timer, qui dit “quand” le lancer. Ils doivent porter le même nom et se situer dans /etc/systemd/system/. Dans mon cas, le service s’appelle project1. J’ai besoin d’internet, donc je spécifie After=network.target, et je veux que le script soit lancé en tant que www-data.

La ligne Type=oneshot est importante, c’est elle qui dit à systemd de ne pas relancer le service en boucle.

# /etc/systemd/system/project1.service
[Unit]
Description=My Little Project
Documentation=http://ungeek.fr/systemd-timer-cest-trop-bien/
After=network.target

[Service]
WorkingDirectory=/home/project1/
User=www-data
ExecStart=/usr/bin/node ./app.js
Type=oneshot
# /etc/systemd/system/project1.timer
[Unit]
Description=Lance project1 toutes les heures, comme souhaité

[Timer]
OnCalendar=hourly

[Install]
WantedBy=timers.target

Il est possible de tester le service avec un simple systemctl start project1.service, de regarder les logs avec journalctl -u project1.service.

Ensuite, pour qu’il soit actif, il faut prévenir systemd :

$ systemctl enable project1.timer
Created symlink from /etc/systemd/system/timers.target.wants/project1.timer to /etc/systemd/system/project1.timer.

$ systemctl start project1.timer

Enfin, on s’assure que tout fonctionne :

$ systemctl status project1.timer
● project1.timer - Lance project1 toutes les heures, comme souhaité
   Loaded: loaded (/etc/systemd/system/project1.timer; disabled)
   Active: active (waiting) since Sun 2015-12-32 00:35:48 CET; 6s ago

Et voilà, maintenant vous pouvez apt purge cron. :D