From 353e12c2f4a9e96a47eb80b80d2ffb7bc1d44a1b Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 9 Feb 2012 03:18:04 +0100 Subject: [PATCH] service: ignore SIGPIPE by default --- NEWS | 5 +++++ TODO | 2 ++ man/systemd.exec.xml | 11 +++++++++++ src/dbus-execute.c | 1 + src/dbus-execute.h | 3 ++- src/execute.c | 14 ++++++++++---- src/execute.h | 2 ++ src/load-fragment-gperf.gperf.m4 | 1 + src/service.c | 1 + units/console-shell.service.m4 | 1 + units/emergency.service | 1 + units/fedora/prefdm.service | 1 + units/getty@.service.m4 | 1 + units/serial-getty@.service.m4 | 1 + 14 files changed, 40 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index e95ac637..7dcac85f 100644 --- a/NEWS +++ b/NEWS @@ -18,6 +18,11 @@ CHANGES WITH 41: * We now limit the set of capabilities of systemd-journald. + * We now set SIGPIPE to ignore by default, since it only is + useful in shell pipelines, and has little use in general + code. This can be disabled with IgnoreSIPIPE=no in unit + files. + Contributions from: Benjamin Franzke, Kay Sievers, Lennart Poettering, Michael Olbrich, Michal Schmidt, Tom Gundersen, William Douglas diff --git a/TODO b/TODO index 42d577ba..ed857f83 100644 --- a/TODO +++ b/TODO @@ -21,6 +21,8 @@ Bugfixes: Features: +* add interface to allow immediate rotation of the journal, and even flushing. + * don't log coredumps of PID 1 into the journal * if a journal file is corrupt, rotate it and create a new one diff --git a/man/systemd.exec.xml b/man/systemd.exec.xml index 8c363a06..ac0f89fb 100644 --- a/man/systemd.exec.xml +++ b/man/systemd.exec.xml @@ -1075,6 +1075,17 @@ this service. + + IgnoreSIGPIPE= + + Takes a boolean + argument. If true causes SIGPIPE to be + ignored in the executed + process. Defaults to true, since + SIGPIPE generally is useful only in + shell pipelines. + + diff --git a/src/dbus-execute.c b/src/dbus-execute.c index c5abcf67..1fd2b213 100644 --- a/src/dbus-execute.c +++ b/src/dbus-execute.c @@ -417,5 +417,6 @@ const BusProperty bus_exec_context_properties[] = { { "UtmpIdentifier", bus_property_append_string, "s", offsetof(ExecContext, utmp_id), true }, { "ControlGroupModify", bus_property_append_bool, "b", offsetof(ExecContext, control_group_modify) }, { "ControlGroupPersistent", bus_property_append_tristate_false, "b", offsetof(ExecContext, control_group_persistent) }, + { "IgnoreSIGPIPE", bus_property_append_bool, "b", offsetof(ExecContext, ignore_sigpipe ) }, { NULL, } }; diff --git a/src/dbus-execute.h b/src/dbus-execute.h index 0aea99e3..03cd69d1 100644 --- a/src/dbus-execute.h +++ b/src/dbus-execute.h @@ -95,7 +95,8 @@ " \n" \ " \n" \ " \n" \ - " \n" + " \n" \ + " \n" #define BUS_EXEC_COMMAND_INTERFACE(name) \ " \n" diff --git a/src/execute.c b/src/execute.c index 536877d6..dab48568 100644 --- a/src/execute.c +++ b/src/execute.c @@ -1038,8 +1038,11 @@ int exec_spawn(ExecCommand *command, default_signals(SIGNALS_CRASH_HANDLER, SIGNALS_IGNORE, -1); - if (sigemptyset(&ss) < 0 || - sigprocmask(SIG_SETMASK, &ss, NULL) < 0) { + if (context->ignore_sigpipe) + ignore_signals(SIGPIPE, -1); + + assert_se(sigemptyset(&ss) == 0); + if (sigprocmask(SIG_SETMASK, &ss, NULL) < 0) { err = -errno; r = EXIT_SIGNAL_MASK; goto fail_child; @@ -1528,6 +1531,7 @@ void exec_context_init(ExecContext *c) { c->kill_signal = SIGTERM; c->send_sigkill = true; c->control_group_persistent = -1; + c->ignore_sigpipe = true; } void exec_context_done(ExecContext *c) { @@ -1876,10 +1880,12 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) { fprintf(f, "%sKillMode: %s\n" "%sKillSignal: SIG%s\n" - "%sSendSIGKILL: %s\n", + "%sSendSIGKILL: %s\n" + "%sIgnoreSIGPIPE: %s\n", prefix, kill_mode_to_string(c->kill_mode), prefix, signal_to_string(c->kill_signal), - prefix, yes_no(c->send_sigkill)); + prefix, yes_no(c->send_sigkill), + prefix, yes_no(c->ignore_sigpipe)); if (c->utmp_id) fprintf(f, diff --git a/src/execute.h b/src/execute.h index ed90c6e3..0d7e7dd6 100644 --- a/src/execute.h +++ b/src/execute.h @@ -128,6 +128,8 @@ struct ExecContext { bool tty_vhangup; bool tty_vt_disallocate; + bool ignore_sigpipe; + /* Since resolving these names might might involve socket * connections and we don't want to deadlock ourselves these * names are resolved on execution only and in the child diff --git a/src/load-fragment-gperf.gperf.m4 b/src/load-fragment-gperf.gperf.m4 index 9191f906..9708ff82 100644 --- a/src/load-fragment-gperf.gperf.m4 +++ b/src/load-fragment-gperf.gperf.m4 @@ -85,6 +85,7 @@ $1.PAMName, config_parse_unit_string_printf, 0, $1.KillMode, config_parse_kill_mode, 0, offsetof($1, exec_context.kill_mode) $1.KillSignal, config_parse_kill_signal, 0, offsetof($1, exec_context.kill_signal) $1.SendSIGKILL, config_parse_bool, 0, offsetof($1, exec_context.send_sigkill) +$1.IgnoreSIGPIPE, config_parse_bool, 0, offsetof($1, exec_context.ignore_sigpipe) $1.UtmpIdentifier, config_parse_unit_string_printf, 0, offsetof($1, exec_context.utmp_id) $1.ControlGroupModify, config_parse_bool, 0, offsetof($1, exec_context.control_group_modify) $1.ControlGroupPersistent, config_parse_tristate, 0, offsetof($1, exec_context.control_group_persistent)' diff --git a/src/service.c b/src/service.c index a190a73b..9ccb1b6b 100644 --- a/src/service.c +++ b/src/service.c @@ -894,6 +894,7 @@ static int service_load_sysv_path(Service *s, const char *path) { s->remain_after_exit = !s->pid_file; s->guess_main_pid = false; s->restart = SERVICE_RESTART_NO; + s->exec_context.ignore_sigpipe = false; if (UNIT(s)->manager->sysv_console) s->exec_context.std_output = EXEC_OUTPUT_JOURNAL_AND_CONSOLE; diff --git a/units/console-shell.service.m4 b/units/console-shell.service.m4 index 02adc840..fef9e1b1 100644 --- a/units/console-shell.service.m4 +++ b/units/console-shell.service.m4 @@ -37,6 +37,7 @@ StandardInput=tty-force StandardOutput=inherit StandardError=inherit KillMode=process +IgnoreSIGPIPE=no # Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash # terminates cleanly. diff --git a/units/emergency.service b/units/emergency.service index 4847f4f0..234bafcc 100644 --- a/units/emergency.service +++ b/units/emergency.service @@ -24,6 +24,7 @@ StandardInput=tty-force StandardOutput=inherit StandardError=inherit KillMode=process +IgnoreSIGPIPE=no # Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash # terminates cleanly. diff --git a/units/fedora/prefdm.service b/units/fedora/prefdm.service index 17ed4cd7..77a0e9ad 100644 --- a/units/fedora/prefdm.service +++ b/units/fedora/prefdm.service @@ -18,3 +18,4 @@ After=getty@tty1.service plymouth-quit.service ExecStart=/etc/X11/prefdm -nodaemon Restart=always RestartSec=0 +IgnoreSIGPIPE=no diff --git a/units/getty@.service.m4 b/units/getty@.service.m4 index d2a145da..a02838d7 100644 --- a/units/getty@.service.m4 +++ b/units/getty@.service.m4 @@ -44,6 +44,7 @@ TTYReset=yes TTYVHangup=yes TTYVTDisallocate=yes KillMode=process +IgnoreSIGPIPE=no # Unset locale for the console getty since the console has problems # displaying some internationalized messages. diff --git a/units/serial-getty@.service.m4 b/units/serial-getty@.service.m4 index e5f0ca6c..fc8b57b9 100644 --- a/units/serial-getty@.service.m4 +++ b/units/serial-getty@.service.m4 @@ -43,6 +43,7 @@ TTYPath=/dev/%I TTYReset=yes TTYVHangup=yes KillMode=process +IgnoreSIGPIPE=no # Some login implementations ignore SIGTERM, so we send SIGHUP # instead, to ensure that login terminates cleanly. -- 2.39.5