Hello Guix! I pushed to the ‘devel’ branch of the Shepherd a new module that implements “timers” along with ‘herd’ support to display information about them.
It lets you provide configuration like this one: --8<---------------cut here---------------start------------->8--- (use-modules (shepherd service timer)) (define timer (service '(my-timer) #:start (make-timer-constructor (calendar-event #:seconds '(0 7 15 22 30 45)) (command '("sh" "-c" "echo Hi from $PWD.; sleep 20; echo done"))) #:stop (make-timer-destructor))) (register-services (list timer)) (start-in-the-background '(my-timer)) --8<---------------cut here---------------end--------------->8--- And then ‘my-timer’ invokes the given command at the moments that match the constraints defined by ‘calendar-event’—in this case any time the number of seconds is equal to 0, 7, 15, 22, 30, or 45. You can also make it every Monday at 9AM etc., as you would expect. The ‘herd’ command provides details information about the timer: --8<---------------cut here---------------start------------->8--- $ ./herd -s sock status my-timer Status of my-timer: It is running since 21:09:32 (68 seconds ago). Timed service. Periodically running: sh -c "echo Hi from $PWD.; sleep 20; echo done". Child process: 1814 It is enabled. Provides (my-timer). Requires (). Will not be respawned. Recent runs: 2024-03-24 21:10:04 Process exited successfully. 2024-03-24 21:10:19 Process exited successfully. 2024-03-24 21:10:26 Process exited successfully. 2024-03-24 21:10:34 Process exited successfully. 2024-03-24 21:10:35 Process terminated with signal 15. Recent messages: 2024-03-24 21:10:29 Hi from /home/ludo. Upcoming timer alarms: 21:10:45 (in 5 seconds) 21:11:00 (in 20 seconds) 21:11:07 (in 27 seconds) 21:11:15 (in 35 seconds) 21:11:22 (in 42 seconds) --8<---------------cut here---------------end--------------->8--- And of course you can do anything you can do with a service: stop it, unload it, load a replacement, and so on. Feedback & suggestions welcome! Ludo’.