From b026af3fe049025118ba3f62949ee789a7317e33 Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Tue, 20 Mar 2018 11:23:51 +0100 Subject: [PATCH] mxqd: Restore SIGPIPE to default for job The mysql client library sets SIGPIPE to SIG_IGN which gets inherited by the user processes: root@sigchld:~# cat /proc/27900/status |grep Sig SigQ: 0/30656 SigPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000000001000 SigCgt: 0000000000000000 This makes a difference for things like CMD | head -1 because CMD is not killed by SIGPIPE when `head` is finished. It will get an error "broken pipe" on the next write and may or may not emit this to stderr. This bug war partially caused by #63, where we changed our own signal handling to synchronous mode. While in the previous mode, we unknowingly fixed the change done by the mysql library, we then just set and reset the blocking mask, which doesn't restore an ignored signal. Restore SIGCHLD to SIG_DFL when we initialize the child process for the user. With this patch applied, no more signals are blocked for the user process. buczek@theinternet:~/git/mxq (restore-sigpipe)$ cat /proc/17081/status |grep Sig SigQ: 1/127301 SigPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000000000000 SigCgt: 0000000000000000 Fixes #71 --- mxqd.c | 1 + 1 file changed, 1 insertion(+) diff --git a/mxqd.c b/mxqd.c index 958686c0..d8fd333d 100644 --- a/mxqd.c +++ b/mxqd.c @@ -719,6 +719,7 @@ static int init_child_process(struct mxq_group_list *glist, struct mxq_job *job) group = &glist->group; sigprocmask(SIG_UNBLOCK,&all_signals,NULL); + signal(SIGPIPE,SIG_DFL); passwd = getpwuid(group->user_uid); if (!passwd) {