GNU Shepherd 1.0.9 released

Ludovic Courtès <[email protected]> Wed, 03 Dec 2025 17:44:10 +0100
Newsgroups gmane.lisp.guile.sources,gmane.comp.gnu.guix.devel,gmane.lisp.guile.user
Message-ID <[email protected]>
--=-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

We are glad to announce version 1.0.9 of the Shepherd, the next
bug-fix release in the 1.0.x series.

Check out the web site to learn more about the Shepherd 1.0.x series:

  https://shepherding.services/news/2024/12/the-shepherd-1.0.0-released/

=E2=80=A2 About

  The Shepherd is a service manager written in Guile that looks after
  the herd of daemons running on the system.  It can be used as an
  =E2=80=9Cinit=E2=80=9D system (PID 1) and also by unprivileged users to m=
anage
  per-user daemons=E2=80=94e.g., gpg-agent, tor, privoxy.  It supports seve=
ral
  daemon startup mechanisms, including inetd, systemd-style socket
  activation, and timers.  The Shepherd is configured in Guile Scheme
  and can be extended in the same language.  It builds on a simple
  memory-safe and callback-free programming model.

  The Shepherd is developed jointly with the Guix project; it is used as
  the init system of Guix System and service manager of Guix Home.

  https://shepherding.services/

=E2=80=A2 Download

  Here are the compressed sources and a GPG detached signature:
    https://ftp.gnu.org/gnu/shepherd/shepherd-1.0.9.tar.gz
    https://ftp.gnu.org/gnu/shepherd/shepherd-1.0.9.tar.gz.sig

  Here are the SHA1 and SHA256 checksums:

    4885c51e6a1a1c81ee165fa0264ddfbbb15aa8b5  shepherd-1.0.9.tar.gz
    e488c585c8418df6e8f476dca81b72910f337c9cd3608fb467de5260004000d6  sheph=
erd-1.0.9.tar.gz

  Authenticate the code by downloading the corresponding .sig file:

    gpg --verify shepherd-1.0.9.tar.gz.sig

  The signing key can be retrieved with:

    gpg --recv-keys 3CE464558A84FDC69DB40CFB090B11993D9AEBB5

  As a last resort to find the key, you can try the official GNU
  keyring:

    wget -q https://ftp.gnu.org/gnu/gnu-keyring.gpg
    gpg --keyring gnu-keyring.gpg --verify shepherd-1.0.9.tar.gz.sig

  It is bit-for-bit reproducible from a checkout of the =E2=80=98v1.0.9=E2=
=80=99 tag of
  the Git repository.


=E2=80=A2 Changes since version 1.0.8

  **  =E2=80=98system-log=E2=80=99 creates parent directories of log files
     (<https://codeberg.org/shepherd/shepherd/issues/82>)

  If the =E2=80=98#:message-destination=E2=80=99 procedure of =E2=80=98syst=
em-log=E2=80=99 returns a log file
  whose parent directories do not exist, =E2=80=98system-log=E2=80=99 will =
now create them
  instead of merely reporting =E2=80=9CNo such file or directory=E2=80=9D a=
s it tries to open
  the log file.

  ** Fix memory leak in process monitor=E2=80=99s =E2=80=98fork/monitor=E2=
=80=99
     (<https://codeberg.org/shepherd/shepherd/issues/40>)

  The =E2=80=98process-monitor=E2=80=99 event loop was recurring from insid=
e a =E2=80=98catch=E2=80=99
  expression in the =E2=80=98fork/monitor=E2=80=99 case, leaking memory ass=
ociated with the
  exception handler.  In the case of inetd services, this would cause a
  per-connection leak as new transient service instances were spawned.

  ** Fix bug that lead to service's stop procedure not being called if a de=
pendent threw an error
     (<https://codeberg.org/shepherd/shepherd/pulls/89>)

  Stopping of dependents inside of stop-services didn't guard against
  errors coming from stop-service of dependents. This meant that
  if a service X tries to stop its dependent A and A throws an error,
  the stop of X is aborted completely and the shutdown-services logic
  reports that there has been an error when stopping X, instead of
  reporting that A has thrown an error. X's stop procedure is
  never called. This could have undesirable consequences on Guix System,
  such as causing file systems to not be properly unmounted in some cases.

  From now on, every shepherd service's stop procedure should get called
  even if dependents throw an error.

  ** Stopping a timer stops its entire process group
     (<https://codeberg.org/shepherd/shepherd/issues/83>)

  Running =E2=80=98herd stop TIMER=E2=80=99 now terminates the entire proce=
ss group of any
  commands TIMER spawned and that are currently running.  Previously, it wo=
uld
  only terminate the main process, possibly leaving child processes behind.

  ** =E2=80=98exec-command=E2=80=99 no longer leaks /dev/null file descript=
or
     (<https://codeberg.org/shepherd/shepherd/issues/19>)

  There used to be a race condition that could lead =E2=80=98exec-command=
=E2=80=99 to leak an
  open file descriptor to /dev/null in child processes.  This is now fixed.

  ** Translations

  This version is fully translated in French, German, Romanian, Swedish, and
  Ukrainian; it is partially translated in several other languages.  Check =
out
  https://translationproject.org/domain/shepherd.html to help translate it =
into
  your language!



Please report bugs to <https://codeberg.org/shepherd/shepherd/issues>.
Join [email protected] for discussions.

Many thanks to everyone who reported bugs or contributed patches!

Ludovic, on behalf of the Shepherd herd.

--=-=-=
Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQJBBAEBCgArFiEEPORkVYqE/cadtAz7CQsRmT2a67UFAmkwaN0NHGx1ZG9AZ251
Lm9yZwAKCRAJCxGZPZrrtbKmEACKw6jm8n1AUPymdUKfd5jsf1+dr/aIaHC66v5q
xaczbTssDJPXrnI6BzH6jn2MESFtdAkh7Ym7IvCEmxqhm0HwQIHBBCsyr4aTs5WZ
FqySQFuzfsW1NQRKfGd5RCjQKC0bJeZJL5iJuUnbRu7uBopY75Wd5D5+t73pddde
/lf04EYdbuV+KITxc6MeUKGgYQA1ABc3UWRSUuOPC0Ju/hyvMphD+HSAxvI58t9p
6+JmJufTLDAry9O32VCJiUfSskNS5IVoN10W/AtgpZCc4vqBifI246Bw41Ub9dh5
ZrPBvDtRqksdtGClCRDODVcFo/PxiZBEbCdlK/jK3o3PGMNk8s2CwGYuYg/GLNtD
xwxuCbCeMJMhlvu5HGW3eBFG6gCeY7QOwF19livsWKuPsHZ7IhE8452jOEzvDpKB
RDKw05QzrfC4roGgDq8WKIZRoxffH13Obeda1ZppZdFRm5TyJKpAP9EnCio1Oa2l
BNcVfHqqgUhtC6W5YaVXYRsj4u1Hb6q1tiEeR3P3psiRDd7YFyGvVC/6+A93yyxZ
ehyaU7p7D1ATYpCcL3zOUE9GbBFuAneWHUYbliwXUq9VGJ20sKku6m1oQBomX5Ob
MTW82YmJv9qDQpwodNZWJJOIQnN0hx2lEYQZz3/w+sgOaGKeGVtO/J7I7EBmEnac
mdGbDQ==
=h+ng
-----END PGP SIGNATURE-----
--=-=-=--