Subject: [Shepherd] Replaced services remain active in the shadows

From: Ludovic Courtès <[email-masked]>
Date: Thu, 25 May 2023 14:59:22 +0200

Hello!

A bug we noticed with the Shepherd 0.10.0 on berlin: after
reconfiguring, which registers a “replacement” for services currently
running, restarting said services (with ‘herd restart’ or similar, which
is supposed to instate the replacement) happens to leave the old service
behind.

Example: ‘ssh-daemon’ is marked as stopped because it cannot bind to
port 22; indeed, there’s still a service listening on port 22, the one
service that should have been replaced.

Likewise for ‘cuirass-web’ for instance: it’s marked as failing to
start, but in fact it’s running; if you try to kill the ‘cuirass web’
process, you can see it’s respawned and /var/log/messages shows that
very clearly.

What seems to happen is that, in both cases, the registry points to the
new service; ‘herd status’ & co. look up the service by name in the
registry, find the new service, and rightfully show that it’s stopped.
But the old service still exists: it’s no longer in the registry, but it
handles SIGCHLD, incoming connections on port 22, etc.

Ludo’.