~ruther/guix-local

e73cf57a204f2bf430c90930394afa08e9ec3399 — Ludovic Courtès 1 year, 5 months ago 75437db
services: shepherd: Add ‘transient’ and ‘timer’.

* gnu/services/shepherd.scm (shepherd-timer-service-type)
(shepherd-transient-service-type): New variables.
* doc/guix.texi (Shepherd Services): Document them.

Change-Id: I9b622e7e947e7a6384c2701a313d0c7080a0a5f6
2 files changed, 85 insertions(+), 2 deletions(-)

M doc/guix.texi
M gnu/services/shepherd.scm
M doc/guix.texi => doc/guix.texi +33 -0
@@ 45702,6 45702,39 @@ system:
                                            (shepherd my-shepherd))))))
@end lisp

@cindex @code{transient} service, Shepherd
@defvar shepherd-transient-service-type
This service type represents the Shepherd's @code{transient} service,
which lets you spawn commands in the background and interact with them
as regular Shepherd service; it is similar to @command{systemd-run}.

For example, the command below spawns @command{rsync} in the background,
in an environment where the @env{SSH_AUTH_SOCK} environment variable has
the given value:

@example
herd spawn transient -E SSH_AUTH_SOCK=$SSH_AUTH_SOCK -- \
  rsync -e ssh -vur . backup.example.org:
@end example

@xref{Transient Service Maker,,, shepherd, The GNU Shepherd Manual}, for
more info on the @code{transient} service.
@end defvar

@cindex @code{timer} service, Shepherd
@defvar shepherd-timer-service-type
This is the service type representing the Shepherd's @code{timer}
service, which lets you schedule the execution of commands, similar to
the venerable @command{at} command.  Here is an example:

@example
herd schedule timer at 07:00 -- mpg123 Music/alarm.mp3
@end example

@xref{Timer Service,,, shepherd, The GNU Shepherd Manual}, for more info
on the @code{timer} service.
@end defvar

@defvar %shepherd-root-service
This service represents PID@tie{}1.
@end defvar

M gnu/services/shepherd.scm => gnu/services/shepherd.scm +52 -2
@@ 1,5 1,5 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013-2016, 2018-2024 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2013-2016, 2018-2025 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2017 Clément Lassieur <clement@lassieur.org>
;;; Copyright © 2018 Carlo Zancanaro <carlo@zancanaro.id.au>
;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>


@@ 81,6 81,8 @@
            shepherd-service-upgrade

            user-processes-service-type
            shepherd-timer-service-type
            shepherd-transient-service-type

            assert-valid-graph))



@@ 668,4 670,52 @@ read-only, just before rebooting/halting.  Processes still running after a few
seconds after @code{SIGTERM} has been sent are terminated with
@code{SIGKILL}.")))

;;; shepherd.scm ends here

;;;
;;; Timer and transient service maker.
;;;

(define shepherd-timer-service-type
  (shepherd-service-type
   'shepherd-timer
   (const (shepherd-service
           (provision '(timer))
           (requirement '(user-processes))
           (modules '((shepherd service timer)))
           (free-form #~(timer-service
                         '#$provision
                         #:requirement '#$requirement))))
   #t                                             ;ignored
   (description "The Shepherd @code{timer} service lets you schedule commands
dynamically, similar to the @code{at} command that your grandparents would use
on that Slackware they got on a floppy disk.  For example, consider this
command:

@example
herd schedule timer at 07:00 -- mpg123 Music/alarm.mp3
@end example

It does exactly what you would expect.")))

(define shepherd-transient-service-type
  (shepherd-service-type
   'shepherd-transient
   (const (shepherd-service
           (provision '(transient))
           (requirement '(user-processes))
           (modules '((shepherd service transient)))
           (free-form #~(transient-service
                         '#$provision
                         #:requirement '#$requirement))))
   #t                                             ;ignored
   (description "The Shepherd @code{transient} service lets you run commands
asynchronously, in the background, similar to @command{systemd-run}, as in
this example:

@example
herd spawn transient -E SSH_AUTH_SOCK=$SSH_AUTH_SOCK -- \\
  rsync -e ssh -vur . backup.example.org:
@end example

This runs @command{rsync} in the background, as a service that you can inspect
with @command{herd status} and stop with @command{herd stop}.")))