[systemd-devel] systemd service causing bash to miss signals?

Brian Reichert reichert at numachi.com
Mon Sep 19 17:54:05 UTC 2022


On Mon, Sep 19, 2022 at 08:25:32PM +0300, Mantas Mikul??nas wrote:
> Pipelines somewhat rely on the kernel delivering SIGPIPE to the writer as
> soon as the read end is closed. So if you have `foo | head -1`, then as
> soon as head reads enough and exits, foo gets killed via SIGPIPE.

In my case:

  cat /dev/urandom|tr -dc "a-zA-Z0-9"|fold -w 64|head -1

'fold' _is_ getting the SIGPIPE.  It won't get killed if it has a handler.

> But as
> most systemd-managed services aren't shell interpreters, systemd marks
> SIGPIPE as "ignored" when starting the service process, so that if the
> service is somehow tricked into opening a pipe that a user has mkfifo'd, at
> least the kernel can't be tricked into killing the service. You can opt out
> of this using IgnoreSIGPIPE=.

Ah, based on your explanation, I see this, which almost exactly
matches my situation.

  https://stackoverflow.com/a/44376786

For me, key takeway:

  However, when the pipeline is run under systemd, systemd sets the
  default action for SIGPIPE to SIG_IGN, which makes the processes
  in the pipeline ignore the signal.

For the archives, I can confirm that putting IgnoreSIGPIPE=false under
[Service] indeed allows my example to work correctly.

-- 
Brian Reichert				<reichert at numachi.com>
BSD admin/developer at large	


More information about the systemd-devel mailing list