GNU bug report logs -
#67132
[Shepherd] Bogus value from PID file can prevent service from being stopped
Previous Next
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
[Message part 1 (text/plain, inline)]
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 67132 <at> debbugs.gnu.org.
--
67132: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=67132
GNU Bug Tracking System
Contact help-debbugs <at> gnu.org with problems
[Message part 2 (message/rfc822, inline)]
Ludovic Courtès <ludo <at> gnu.org> 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’.
[Message part 3 (message/rfc822, inline)]
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 180 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.