diff options
author | Lennart Poettering <lennart@poettering.net> | 2012-02-09 03:18:04 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2012-02-09 03:18:04 +0100 |
commit | 353e12c2f4a9e96a47eb80b80d2ffb7bc1d44a1b (patch) | |
tree | 0bd79a2c40d8d60892666affbbb89690f29c672e | |
parent | 12ac304714996c3c3308d014b301d0d42d16c117 (diff) |
service: ignore SIGPIPE by defaultv41
-rw-r--r-- | NEWS | 5 | ||||
-rw-r--r-- | TODO | 2 | ||||
-rw-r--r-- | man/systemd.exec.xml | 11 | ||||
-rw-r--r-- | src/dbus-execute.c | 1 | ||||
-rw-r--r-- | src/dbus-execute.h | 3 | ||||
-rw-r--r-- | src/execute.c | 14 | ||||
-rw-r--r-- | src/execute.h | 2 | ||||
-rw-r--r-- | src/load-fragment-gperf.gperf.m4 | 1 | ||||
-rw-r--r-- | src/service.c | 1 | ||||
-rw-r--r-- | units/console-shell.service.m4 | 1 | ||||
-rw-r--r-- | units/emergency.service | 1 | ||||
-rw-r--r-- | units/fedora/prefdm.service | 1 | ||||
-rw-r--r-- | units/getty@.service.m4 | 1 | ||||
-rw-r--r-- | units/serial-getty@.service.m4 | 1 |
14 files changed, 40 insertions, 5 deletions
@@ -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 @@ -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 8c363a069..ac0f89fb8 100644 --- a/man/systemd.exec.xml +++ b/man/systemd.exec.xml @@ -1075,6 +1075,17 @@ this service.</para></listitem> </varlistentry> + <varlistentry> + <term><varname>IgnoreSIGPIPE=</varname></term> + + <listitem><para>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.</para></listitem> + </varlistentry> + </variablelist> </refsect1> diff --git a/src/dbus-execute.c b/src/dbus-execute.c index c5abcf674..1fd2b2133 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 0aea99e33..03cd69d12 100644 --- a/src/dbus-execute.h +++ b/src/dbus-execute.h @@ -95,7 +95,8 @@ " <property name=\"UtmpIdentifier\" type=\"s\" access=\"read\"/>\n" \ " <property name=\"ControlGroupModify\" type=\"b\" access=\"read\"/>\n" \ " <property name=\"ControlGroupPersistent\" type=\"b\" access=\"read\"/>\n" \ - " <property name=\"PrivateNetwork\" type=\"b\" access=\"read\"/>\n" + " <property name=\"PrivateNetwork\" type=\"b\" access=\"read\"/>\n" \ + " <property name=\"IgnoreSIGPIPE\" type=\"b\" access=\"read\"/>\n" #define BUS_EXEC_COMMAND_INTERFACE(name) \ " <property name=\"" name "\" type=\"a(sasbttuii)\" access=\"read\"/>\n" diff --git a/src/execute.c b/src/execute.c index 536877d68..dab485682 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 ed90c6e3e..0d7e7dd65 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 9191f9064..9708ff828 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 a190a73b4..9ccb1b6bc 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 02adc8403..fef9e1b17 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 4847f4f0c..234bafcc8 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 17ed4cd78..77a0e9ad7 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 d2a145dac..a02838d78 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 e5f0ca6c6..fc8b57b93 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. |