Skip to content

Commit a232ebc

Browse files
committed
core: add support for RestartKillSignal= to override signal used for restart jobs
v2: - if RestartKillSignal= is not specified, fall back to KillSignal=. This is necessary to preserve backwards compatibility (and keep KillSignal= generally useful).
1 parent 28a2dfe commit a232ebc

File tree

15 files changed

+85
-16
lines changed

15 files changed

+85
-16
lines changed

shell-completion/bash/systemd-run

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ _systemd_run() {
8080
SendSIGKILL= MemoryLimit= CPUShares= BlockIOWeight= User= Group=
8181
DevicePolicy= KillMode= DeviceAllow= BlockIOReadBandwidth=
8282
BlockIOWriteBandwidth= BlockIODeviceWeight= Nice= Environment=
83-
KillSignal= FinalKillSignal= LimitCPU= LimitFSIZE= LimitDATA=
83+
KillSignal= RestartKillSignal= FinalKillSignal= LimitCPU= LimitFSIZE= LimitDATA=
8484
LimitSTACK= LimitCORE= LimitRSS= LimitNOFILE= LimitAS= LimitNPROC=
8585
LimitMEMLOCK= LimitLOCKS= LimitSIGPENDING= LimitMSGQUEUE=
8686
LimitNICE= LimitRTPRIO= LimitRTTIME= PrivateTmp= PrivateDevices=

shell-completion/zsh/_systemd-run

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ _arguments \
3535
SendSIGKILL= MemoryLimit= CPUShares= BlockIOWeight= User= Group= \
3636
DevicePolicy= KillMode= DeviceAllow= BlockIOReadBandwidth= \
3737
BlockIOWriteBandwidth= BlockIODeviceWeight= Nice= Environment= \
38-
KillSignal= FinalKillSignal= LimitCPU= LimitFSIZE= LimitDATA= \
38+
KillSignal= RestartKillSignal= FinalKillSignal= LimitCPU= LimitFSIZE= LimitDATA= \
3939
LimitSTACK= LimitCORE= LimitRSS= LimitNOFILE= LimitAS= LimitNPROC= \
4040
LimitMEMLOCK= LimitLOCKS= LimitSIGPENDING= LimitMSGQUEUE= \
4141
LimitNICE= LimitRTPRIO= LimitRTTIME= PrivateTmp= PrivateDevices= \

src/core/dbus-kill.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,28 @@
88

99
static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_kill_mode, kill_mode, KillMode);
1010

11+
static int property_get_restart_kill_signal(
12+
sd_bus *bus,
13+
const char *path,
14+
const char *interface,
15+
const char *property,
16+
sd_bus_message *reply,
17+
void *userdata,
18+
sd_bus_error *error) {
19+
KillContext *c = userdata;
20+
int s;
21+
22+
assert(c);
23+
24+
s = restart_kill_signal(c);
25+
return sd_bus_message_append_basic(reply, 'i', &s);
26+
}
27+
1128
const sd_bus_vtable bus_kill_vtable[] = {
1229
SD_BUS_VTABLE_START(0),
1330
SD_BUS_PROPERTY("KillMode", "s", property_get_kill_mode, offsetof(KillContext, kill_mode), SD_BUS_VTABLE_PROPERTY_CONST),
1431
SD_BUS_PROPERTY("KillSignal", "i", bus_property_get_int, offsetof(KillContext, kill_signal), SD_BUS_VTABLE_PROPERTY_CONST),
32+
SD_BUS_PROPERTY("RestartKillSignal", "i", property_get_restart_kill_signal, 0, SD_BUS_VTABLE_PROPERTY_CONST),
1533
SD_BUS_PROPERTY("FinalKillSignal", "i", bus_property_get_int, offsetof(KillContext, final_kill_signal), SD_BUS_VTABLE_PROPERTY_CONST),
1634
SD_BUS_PROPERTY("SendSIGKILL", "b", bus_property_get_bool, offsetof(KillContext, send_sigkill), SD_BUS_VTABLE_PROPERTY_CONST),
1735
SD_BUS_PROPERTY("SendSIGHUP", "b", bus_property_get_bool, offsetof(KillContext, send_sighup), SD_BUS_VTABLE_PROPERTY_CONST),
@@ -21,6 +39,7 @@ const sd_bus_vtable bus_kill_vtable[] = {
2139

2240
static BUS_DEFINE_SET_TRANSIENT_PARSE(kill_mode, KillMode, kill_mode_from_string);
2341
static BUS_DEFINE_SET_TRANSIENT_TO_STRING(kill_signal, "i", int32_t, int, "%" PRIi32, signal_to_string_with_check);
42+
static BUS_DEFINE_SET_TRANSIENT_TO_STRING(restart_kill_signal, "i", int32_t, int, "%" PRIi32, signal_to_string_with_check);
2443
static BUS_DEFINE_SET_TRANSIENT_TO_STRING(final_kill_signal, "i", int32_t, int, "%" PRIi32, signal_to_string_with_check);
2544
static BUS_DEFINE_SET_TRANSIENT_TO_STRING(watchdog_signal, "i", int32_t, int, "%" PRIi32, signal_to_string_with_check);
2645

@@ -51,6 +70,9 @@ int bus_kill_context_set_transient_property(
5170
if (streq(name, "KillSignal"))
5271
return bus_set_transient_kill_signal(u, name, &c->kill_signal, message, flags, error);
5372

73+
if (streq(name, "RestartKillSignal"))
74+
return bus_set_transient_restart_kill_signal(u, name, &c->restart_kill_signal, message, flags, error);
75+
5476
if (streq(name, "FinalKillSignal"))
5577
return bus_set_transient_final_kill_signal(u, name, &c->final_kill_signal, message, flags, error);
5678

src/core/kill.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ void kill_context_init(KillContext *c) {
99
assert(c);
1010

1111
c->kill_signal = SIGTERM;
12+
/* restart_kill_signal is unset by default and we fall back to kill_signal */
1213
c->final_kill_signal = SIGKILL;
1314
c->send_sigkill = true;
1415
c->send_sighup = false;
@@ -23,11 +24,13 @@ void kill_context_dump(KillContext *c, FILE *f, const char *prefix) {
2324
fprintf(f,
2425
"%sKillMode: %s\n"
2526
"%sKillSignal: SIG%s\n"
27+
"%sRestartKillSignal: SIG%s\n"
2628
"%sFinalKillSignal: SIG%s\n"
2729
"%sSendSIGKILL: %s\n"
2830
"%sSendSIGHUP: %s\n",
2931
prefix, kill_mode_to_string(c->kill_mode),
3032
prefix, signal_to_string(c->kill_signal),
33+
prefix, signal_to_string(restart_kill_signal(c)),
3134
prefix, signal_to_string(c->final_kill_signal),
3235
prefix, yes_no(c->send_sigkill),
3336
prefix, yes_no(c->send_sighup));

src/core/kill.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ typedef enum KillMode {
2121
struct KillContext {
2222
KillMode kill_mode;
2323
int kill_signal;
24+
int restart_kill_signal;
2425
int final_kill_signal;
2526
int watchdog_signal;
2627
bool send_sigkill;
@@ -47,3 +48,9 @@ KillMode kill_mode_from_string(const char *s) _pure_;
4748

4849
const char *kill_who_to_string(KillWho k) _const_;
4950
KillWho kill_who_from_string(const char *s) _pure_;
51+
52+
static inline int restart_kill_signal(const KillContext *c) {
53+
if (c->restart_kill_signal != 0)
54+
return c->restart_kill_signal;
55+
return c->kill_signal;
56+
}

src/core/load-fragment-gperf.gperf.m4

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ m4_define(`KILL_CONTEXT_CONFIG_ITEMS',
161161
$1.SendSIGHUP, config_parse_bool, 0, offsetof($1, kill_context.send_sighup)
162162
$1.KillMode, config_parse_kill_mode, 0, offsetof($1, kill_context.kill_mode)
163163
$1.KillSignal, config_parse_signal, 0, offsetof($1, kill_context.kill_signal)
164+
$1.RestartKillSignal, config_parse_signal, 0, offsetof($1, kill_context.restart_kill_signal)
164165
$1.FinalKillSignal, config_parse_signal, 0, offsetof($1, kill_context.final_kill_signal)
165166
$1.WatchdogSignal, config_parse_signal, 0, offsetof($1, kill_context.watchdog_signal)'
166167
)m4_dnl

src/core/mount.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -866,6 +866,8 @@ static int state_to_kill_operation(MountState state) {
866866
switch (state) {
867867

868868
case MOUNT_REMOUNTING_SIGTERM:
869+
return KILL_RESTART;
870+
869871
case MOUNT_UNMOUNTING_SIGTERM:
870872
return KILL_TERMINATE;
871873

src/core/service.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1838,13 +1838,17 @@ static void service_enter_stop_post(Service *s, ServiceResult f) {
18381838
service_enter_signal(s, SERVICE_FINAL_SIGTERM, SERVICE_FAILURE_RESOURCES);
18391839
}
18401840

1841-
static int state_to_kill_operation(ServiceState state) {
1841+
static int state_to_kill_operation(Service *s, ServiceState state) {
18421842
switch (state) {
18431843

18441844
case SERVICE_STOP_WATCHDOG:
18451845
return KILL_WATCHDOG;
18461846

18471847
case SERVICE_STOP_SIGTERM:
1848+
if (unit_has_job_type(UNIT(s), JOB_RESTART))
1849+
return KILL_RESTART;
1850+
_fallthrough_;
1851+
18481852
case SERVICE_FINAL_SIGTERM:
18491853
return KILL_TERMINATE;
18501854

@@ -1875,7 +1879,7 @@ static void service_enter_signal(Service *s, ServiceState state, ServiceResult f
18751879
r = unit_kill_context(
18761880
UNIT(s),
18771881
&s->kill_context,
1878-
state_to_kill_operation(state),
1882+
state_to_kill_operation(s, state),
18791883
s->main_pid,
18801884
s->control_pid,
18811885
s->main_pid_alien);

src/core/socket.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2077,6 +2077,16 @@ static void socket_enter_stop_post(Socket *s, SocketResult f) {
20772077
socket_enter_signal(s, SOCKET_FINAL_SIGTERM, SOCKET_FAILURE_RESOURCES);
20782078
}
20792079

2080+
static int state_to_kill_operation(Socket *s, SocketState state) {
2081+
if (state == SOCKET_STOP_PRE_SIGTERM && unit_has_job_type(UNIT(s), JOB_RESTART))
2082+
return KILL_RESTART;
2083+
2084+
if (state == SOCKET_FINAL_SIGTERM)
2085+
return KILL_TERMINATE;
2086+
2087+
return KILL_KILL;
2088+
}
2089+
20802090
static void socket_enter_signal(Socket *s, SocketState state, SocketResult f) {
20812091
int r;
20822092

@@ -2088,8 +2098,7 @@ static void socket_enter_signal(Socket *s, SocketState state, SocketResult f) {
20882098
r = unit_kill_context(
20892099
UNIT(s),
20902100
&s->kill_context,
2091-
!IN_SET(state, SOCKET_STOP_PRE_SIGTERM, SOCKET_FINAL_SIGTERM) ?
2092-
KILL_KILL : KILL_TERMINATE,
2101+
state_to_kill_operation(s, state),
20932102
-1,
20942103
s->control_pid,
20952104
false);

src/core/swap.c

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -712,21 +712,32 @@ static void swap_enter_dead_or_active(Swap *s, SwapResult f) {
712712
swap_enter_dead(s, f);
713713
}
714714

715+
static int state_to_kill_operation(Swap *s, SwapState state) {
716+
if (state == SWAP_DEACTIVATING_SIGTERM) {
717+
if (unit_has_job_type(UNIT(s), JOB_RESTART))
718+
return KILL_RESTART;
719+
else
720+
return KILL_TERMINATE;
721+
}
722+
723+
return KILL_KILL;
724+
}
725+
715726
static void swap_enter_signal(Swap *s, SwapState state, SwapResult f) {
716727
int r;
717-
KillOperation kop;
718728

719729
assert(s);
720730

721731
if (s->result == SWAP_SUCCESS)
722732
s->result = f;
723733

724-
if (state == SWAP_DEACTIVATING_SIGTERM)
725-
kop = KILL_TERMINATE;
726-
else
727-
kop = KILL_KILL;
728734

729-
r = unit_kill_context(UNIT(s), &s->kill_context, kop, -1, s->control_pid, false);
735+
r = unit_kill_context(UNIT(s),
736+
&s->kill_context,
737+
state_to_kill_operation(s, state),
738+
-1,
739+
s->control_pid,
740+
false);
730741
if (r < 0)
731742
goto fail;
732743

0 commit comments

Comments
 (0)