From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34751) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dX1Ti-0004qr-N4 for guix-patches@gnu.org; Mon, 17 Jul 2017 04:34:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dX1Te-0006WZ-1G for guix-patches@gnu.org; Mon, 17 Jul 2017 04:34:06 -0400 Received: from debbugs.gnu.org ([208.118.235.43]:40504) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dX1Td-0006WU-UB for guix-patches@gnu.org; Mon, 17 Jul 2017 04:34:01 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1dX1Td-0003w2-PH for guix-patches@gnu.org; Mon, 17 Jul 2017 04:34:01 -0400 Subject: [bug#27553] [PATCH shepherd] Register SIGCHLD handler after primitive fork Resent-Message-ID: From: ludo@gnu.org (Ludovic =?UTF-8?Q?Court=C3=A8s?=) References: <87a849bar1.fsf@gnu.org> Date: Mon, 17 Jul 2017 10:33:03 +0200 In-Reply-To: (Jelle Licht's message of "Fri, 14 Jul 2017 14:19:12 +0200") Message-ID: <87wp77ea4g.fsf@gnu.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+kyle=kyleam.com@gnu.org Sender: "Guix-patches" To: Jelle Licht Cc: 27553@debbugs.gnu.org Hi Jelle, Jelle Licht skribis: > 2017-07-12 23:34 GMT+02:00 Ludovic Court=C3=A8s : > >> Hi Jelle, >> >> Jelle Licht skribis: >> >> > I am not sure if this is also the proper ML for the GNU Shepherd, but >> > looking in the archives lead me to believe it actually is. If not, I >> > suggest the gnu.org page for shepherd be updated with the correct info. >> >> It=E2=80=99s the right list. :-) >> > I am glad it turned out to be :-). Perhaps [1] can be updated to the same > info as [2]? Done! >> > I recently starting playing around with user shepherd, and found out t= hat >> > when running a shepherd 0.3.2 daemonized as non-init process (via >> "(action >> > 'shepherd 'daemonize)"), zombie processes are created whenever you sta= rt >> > and subsequently stop any service. >> > >> > Thinking I did something wrong, I asked lfam on #guix to share his (ve= ry >> > helpful) init.scm for user shepherd, yet I still noticed the same >> behaviour. >> > >> > I believe commit `efa2f45c5f7dc735407381b7b8a83d6c37f828db' >> inadvertently >> > introduced an ordering issue, where the SIGCHLD handler is registered >> > /before/ shepherd has the chance to daemonize. I believe the following >> > trivial patch addresses this snafu. >> >> The config file can start services, so the SIGCHLD handler must be >> installed before we read the config file (otherwise we could be missing >> some process termination notifications.) >> > What do you mean exactly? I think my config file does this, and I have not > yet noticed this issue, > but I might just be confused about what you mean here. If the config file spawns a process and that process dies before we have installed the SIGCHLD handler, then we=E2=80=99ll never know that it has terminated. >> Perhaps a solution would be to install the SIGCHLD handler lazily upon >> the first =E2=80=98fork+exec-command=E2=80=99 call? That would ensure b= oth that (1) >> users have a chance to daemonize before the handler is installed, and >> (2) that the handler is installed before services are started. >> >> Thoughts? >> > This seems like it would be for the best. I actually have no clue how to > implement this though. I=E2=80=99d imagine something like a global variable (a Boolean) telling wh= ether the SIGCHLD handler is installed, and then: (unless %sigchld-handler-installed? (sigaction =E2=80=A6) (set! %sigchld-handler-installed? #t)) Thoughts? Ludo=E2=80=99.