Subject: Re: bug#74279: Shepherd service is not getting respawned.

From: Ludovic Courtès <[email-masked]>
Date: Sun, 10 Nov 2024 12:32:48 +0100

Hi Tomas,

Tomas Volf <[email-masked]> skribis:

>         (start #~(lambda _
>                    (let* ((cmd "/run/privileged/bin/ping -qc1 -W1 1.1.1.1")
>                           (status (system cmd)))
>                      (= 0 (status:exit-val status)))))
>         (one-shot? #t)
>         ;; Try every second.
>         (respawn-delay 1)
>         ;; Retry forever.  Double-quoting is intentional.
>         (respawn-limit ''(5 . 5)))))

[...]

> Nov  7 00:18:20 localhost shepherd[1]: Starting service network-online...
> [..]
> Nov  7 00:18:20 localhost shepherd[1]: [sh] PING 192.168.0.110 (192.168.0.110): 56 data bytes
> Nov  7 00:18:20 localhost shepherd[1]: [sh] /run/privileged/bin/ping: sending packet: Network is unreachable
> Nov  7 00:18:20 localhost shepherd[1]: Service network-online could not be started.
> Nov  7 00:18:20 localhost shepherd[1]: Service network-online failed to start.

I think there’s a misunderstanding here: ‘respawn?’ is about respawning
a service that, once it is running, terminates prematurely.

In your case, the service does not start (its ‘start’ method returns
#f).

Now, it would probably make sense to have a mechanism to retry starting
services.

In the specific case of ‘network-online’ though, you could use a
different approach: the ‘start’ method could itself try retry pinging
the network several times and fail only if it failed to reach the
network after, say, 10s.  (Remember that ‘start’ and ‘stop’ must
complete in a timely fashion.)

HTH,
Ludo’.