GNU bug report logs - #64455
shepherd: unable to use redefined system/system* in 0.10.1

Previous Next

Package: guix;

Reported by: "buma2023 <at> outlook.fr" <buma2023 <at> outlook.fr>

Date: Tue, 4 Jul 2023 06:53:02 UTC

Severity: important

Done: Ludovic Courtès <ludo <at> gnu.org>

Bug is archived. No further changes may be made.

Full log


Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: "buma2023 <at> outlook.fr" <buma2023 <at> outlook.fr>
To: "bug-guix <at> gnu.org" <bug-guix <at> gnu.org>
Cc: "buma2023 <at> outlook.fr" <buma2023 <at> outlook.fr>
Subject: shepherd: unable to use redefined system/system* in 0.10.1
Date: Mon, 3 Jul 2023 17:46:33 +0000
[Message part 1 (text/plain, inline)]
Hello,

I am using happily shepherd since a few years as my init system on
Debian: amd64 (desktop and notebook), armhf (Cubox).

I was using 0.9.1 with guile-3.0.5 and fibers-1.1.1.

I recently tried 0.10.1 with guile-3.0.9 and fibers 1.3.1 and
encountered a problem with using system and system* in my services:
the simple fact to have the symbol system or system* in
/etc/shepherd.scm or included files (even if the command is not
executed) leads to a misbehaving shepherd, more specifically the
shepherd socket disappears; the system boots but with multiple
instances of the launched daemons.

If a system/system* command is executed while booting, shepherd
blocks at the point of its execution.

Example of service causing the failure:

(register-services
 (make <service>
   #:provides '(mytest)
   #:start (lambda args
           (system "touch /tmp/somefile")
           #t)
   ))

The service is not started at boot, I have to do it manually afterwards,
but I never can go there, as the shepherd socket is missing.

I I add at the end of /etc/shepherd.scm:
(system "touch /tmp/somefile")

I have the same problem.

Strangely at build time the test tests/system-star.sh succeeds, and
after I have booted (without refering to a system/system* command) , I
can run:

# export PID=$$; herd eval root "(system \"echo success! >/proc/$PID/fd/1\")"

(in my case, output appears in /var/log/syslog so I need the redirection)

I have read a bit documentation and code to be aware that system and
system* were redefined in shepherd to be non blocking, I suspect the
problem is how this is done.

I would prefer to have new names in shepherd for the redefined
system/system* and keep the old ones intact.

I have a workaround for this problem: replacing system/system* by
helpers I use, like:

(define (system-value command)
  "Return first line of output when calling (system command)"
  (let* ((port (open-input-pipe command))
       (str (read-line port)))
    (close-pipe port)
    str))

but this is a band-aid.

[Message part 2 (text/html, inline)]

This bug report was last modified 1 year and 352 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.