GNU bug report logs - #67132
[Shepherd] Bogus value from PID file can prevent service from being stopped

Previous Next

Package: guix;

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

Date: Sun, 12 Nov 2023 17:47:01 UTC

Severity: normal

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

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: Ludovic Courtès <ludo <at> gnu.org>
To: 67132 <at> debbugs.gnu.org
Subject: bug#67132: [Shepherd] Bogus value from PID file can prevent service from being stopped
Date: Sun, 12 Nov 2023 18:45:38 +0100
Hi,

‘terminate-process’ in (shepherd service) assumes that, once it has sent
SIGKILL to a given PID, it eventually gets a SIGCHLD notification for
that PID.

Unfortunately there are corner cases where it doesn’t hold.  Take PID 2:

--8<---------------cut here---------------start------------->8---
$ ps x 2
  PID TTY      STAT   TIME COMMAND
    2 ?        S      0:00 [kthreadd]
--8<---------------cut here---------------end--------------->8---

That’s not a “real” process, so when you (kill 2 SIGKILL), nothing
happens.  Thus, ‘terminate-process’ never returns; the corresponding
service stays in “stopping” state and you cannot halt your machine.

You may wonder how we end up calling ‘terminate-process’ with a “bogus”
PID.  It normally never happens, but it can happen with a combination of
‘make-forkexec-constructor’ with #:pid-file and
‘least-authority-wrapper’: the PID file of the wrapper may read “2” (the
PID inside the least-authority PID namespace), so ‘herd stop’ on that
service will end up doing (kill 2 SIGKILL).

Ludo’.




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

Previous Next


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