Subject: bug#67132: closed (Re: bug#67132: [Shepherd] Bogus value from PID file can prevent service from being stopped)

From: [email-masked] (GNU bug Tracking System)
Date: Wed, 22 Nov 2023 10:17:02 +0000

Your bug report

#67132: [Shepherd] Bogus value from PID file can prevent service from being stopped

which was filed against the guix package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
67132: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=67132
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#67132: [Shepherd] Bogus value from PID file can prevent service from being stopped
From: Ludovic Courtès <[email-masked]>
To: [email-masked]
Date: Wed, 22 Nov 2023 11:16:37 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

Ludovic Courtès <[email-masked]> skribis:

> ‘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:
>
> $ ps x 2
>   PID TTY      STAT   TIME COMMAND
>     2 ?        S      0:00 [kthreadd]
>
> 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.

Fixed in Shepherd commit cc9c5c029534458ae547d78200b6b51f729654e3.

Ludo’.

Subject: [Shepherd] Bogus value from PID file can prevent service from being stopped
From: Ludovic Courtès <[email-masked]>
To: [email-masked]
Date: Sun, 12 Nov 2023 18:45:38 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

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’.