]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core: add IgnoreOnSoftReboot= unit option
authorLuca Boccassi <bluca@debian.org>
Thu, 20 Jul 2023 00:22:52 +0000 (01:22 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 21 Jul 2023 16:05:41 +0000 (18:05 +0200)
As it says on the tin, configures the unit to survive a soft reboot.
Currently all the following options have to be set by hand:

Conflicts=reboot.target kexec.target poweroff.target halt.target
Before=reboot.target kexec.target poweroff.target halt.target
After=sysinit.target basic.target
DefaultDependencies=no
IgnoreOnIsolate=yes

This is not very user friendly. If new default dependencies are added,
or new shutdown/reboot types, they also have to be added manually.

The new option is much simpler, easy to find, and does the right thing
by default.

18 files changed:
man/org.freedesktop.systemd1.xml
man/systemd-soft-reboot.service.xml
man/systemd.unit.xml
src/core/dbus-unit.c
src/core/load-fragment-gperf.gperf.in
src/core/path.c
src/core/scope.c
src/core/service.c
src/core/slice.c
src/core/socket.c
src/core/target.c
src/core/timer.c
src/core/transaction.c
src/core/unit-serialize.c
src/core/unit.c
src/core/unit.h
src/shared/bus-unit-util.c
test/units/testsuite-82.sh

index 56906e2f3b29b4bd8fa74e23b626ba90baeb86c7..717990edcc77738b34e863f8f35355175dc7738d 100644 (file)
@@ -1977,6 +1977,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly b DefaultDependencies = ...;
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+      readonly b IgnoreOnSoftReboot = ...;
+      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly s OnSuccessJobMode = '...';
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly s OnFailureJobMode = '...';
@@ -2091,6 +2093,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
 
     <!--property CanFreeze is not documented!-->
 
+    <!--property IgnoreOnSoftReboot is not documented!-->
+
     <!--property OnSuccessJobMode is not documented!-->
 
     <!--property OnFailureJobMode is not documented!-->
@@ -2303,6 +2307,8 @@ node /org/freedesktop/systemd1/unit/avahi_2ddaemon_2eservice {
 
     <variablelist class="dbus-property" generated="True" extra-ref="DefaultDependencies"/>
 
+    <variablelist class="dbus-property" generated="True" extra-ref="IgnoreOnSoftReboot"/>
+
     <variablelist class="dbus-property" generated="True" extra-ref="OnSuccessJobMode"/>
 
     <variablelist class="dbus-property" generated="True" extra-ref="OnFailureJobMode"/>
index 5960cf90a6c42d808284e84efc3522a4e3376984..15cec5a6f3790d9867b1b933e8fbcdf400e47f23 100644 (file)
     otherwise the old root filesystem will be kept in memory as long as the unit is running.</para>
 
     <para>If units shall be left running until the very end of shutdown during a soft reboot operation, but
-    shall be terminated regularly during other forms of shutdown, it's recommended to set
-    <varname>DefaultDependencies=no</varname> and then place
-    <varname>Conflicts=</varname>/<varname>Before=</varname> onto <filename>reboot.target</filename>,
-    <filename>kexec.target</filename>, <filename>poweroff.target</filename> and
-    <filename>halt.target</filename> (but <emphasis>not</emphasis> onto
-    <filename>soft-reboot.target</filename>).</para>
+    shall be terminated regularly during other forms of shutdown, <varname>IgnoreOnSoftReboot=yes</varname>
+    can be set. This will ensure that soft reboot operations do not affect it, but other types of reboot
+    or shutdown stop it as expected.</para>
   </refsect1>
 
   <refsect1>
index 94a5a30f929d65de34ead42ba909eee6d465b907..9646dea9134bcb33dc86da93aec84aa871ec44b6 100644 (file)
         ones.</para></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>IgnoreOnSoftReboot=</varname></term>
+
+        <listitem><para>Takes a boolean argument. Defaults to <option>no</option>. If <option>yes</option>,
+        the unit will be configured to survive a soft reboot operation (see:
+        <citerefentry><refentrytitle>systemd-soft-reboot.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>).
+        This will ensure the unit is stopped normally during reboot or shutdown operations, but it survives
+        a soft reboot by not being stopped on the way down or on the way back up.</para></listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>CollectMode=</varname></term>
 
index 629f08ebcc6c04e098d94b9b49001664e2d2afeb..bacdeb5aa31bd29455b295398a17361edc292709 100644 (file)
@@ -921,6 +921,7 @@ const sd_bus_vtable bus_unit_vtable[] = {
         SD_BUS_PROPERTY("RefuseManualStop", "b", bus_property_get_bool, offsetof(Unit, refuse_manual_stop), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("AllowIsolate", "b", bus_property_get_bool, offsetof(Unit, allow_isolate), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("DefaultDependencies", "b", bus_property_get_bool, offsetof(Unit, default_dependencies), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("IgnoreOnSoftReboot", "b", bus_property_get_bool, offsetof(Unit, ignore_on_soft_reboot), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("OnSuccesJobMode", "s", property_get_job_mode, offsetof(Unit, on_success_job_mode), SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN), /* deprecated */
         SD_BUS_PROPERTY("OnSuccessJobMode", "s", property_get_job_mode, offsetof(Unit, on_success_job_mode), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("OnFailureJobMode", "s", property_get_job_mode, offsetof(Unit, on_failure_job_mode), SD_BUS_VTABLE_PROPERTY_CONST),
@@ -2175,6 +2176,9 @@ static int bus_unit_set_transient_property(
         if (streq(name, "DefaultDependencies"))
                 return bus_set_transient_bool(u, name, &u->default_dependencies, message, flags, error);
 
+        if (streq(name, "IgnoreOnSoftReboot"))
+                return bus_set_transient_bool(u, name, &u->ignore_on_soft_reboot, message, flags, error);
+
         if (streq(name, "OnSuccessJobMode"))
                 return bus_set_transient_job_mode(u, name, &u->on_success_job_mode, message, flags, error);
 
index b66adf281193617c56b70b462cee4ff29d8003c1..1ac57c636496b35c1f624bc1c35fcc289b51308e 100644 (file)
@@ -312,6 +312,7 @@ Unit.RefuseManualStart,                  config_parse_bool,
 Unit.RefuseManualStop,                   config_parse_bool,                           0,                                  offsetof(Unit, refuse_manual_stop)
 Unit.AllowIsolate,                       config_parse_bool,                           0,                                  offsetof(Unit, allow_isolate)
 Unit.DefaultDependencies,                config_parse_bool,                           0,                                  offsetof(Unit, default_dependencies)
+Unit.IgnoreOnSoftReboot,                 config_parse_bool,                           0,                                  offsetof(Unit, ignore_on_soft_reboot)
 Unit.OnSuccessJobMode,                   config_parse_job_mode,                       0,                                  offsetof(Unit, on_success_job_mode)
 Unit.OnFailureJobMode,                   config_parse_job_mode,                       0,                                  offsetof(Unit, on_failure_job_mode)
 {# The following is a legacy alias name for compatibility #}
index 5fb14d9a10b4521ec796cfe965e238f69fce0e77..c76110a02fb133191c53eab1e5f76309bc1ea1c3 100644 (file)
@@ -342,12 +342,24 @@ static int path_add_default_dependencies(Path *p) {
                 return r;
 
         if (MANAGER_IS_SYSTEM(UNIT(p)->manager)) {
-                r = unit_add_two_dependencies_by_name(UNIT(p), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SYSINIT_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
+                r = unit_add_two_dependencies_by_name(UNIT(p),
+                                UNIT_AFTER,
+                                UNIT(p)->ignore_on_soft_reboot ? -EINVAL : UNIT_REQUIRES,
+                                SPECIAL_SYSINIT_TARGET,
+                                true,
+                                UNIT_DEPENDENCY_DEFAULT);
                 if (r < 0)
                         return r;
         }
 
-        return unit_add_two_dependencies_by_name(UNIT(p), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
+        if (!UNIT(p)->ignore_on_soft_reboot)
+                return unit_add_two_dependencies_by_name(
+                                UNIT(p),
+                                UNIT_BEFORE, UNIT_CONFLICTS,
+                                SPECIAL_SHUTDOWN_TARGET, true,
+                                UNIT_DEPENDENCY_DEFAULT);
+
+        return unit_add_dependencies_on_real_shutdown_targets(UNIT(p));
 }
 
 static int path_add_trigger_dependencies(Path *p) {
index 72253421e232b94bd24bbef6123700e064632e9e..a8461415bd88e1140d015e9be61156c54cb4956f 100644 (file)
@@ -131,23 +131,22 @@ static void scope_set_state(Scope *s, ScopeState state) {
 }
 
 static int scope_add_default_dependencies(Scope *s) {
-        int r;
-
         assert(s);
 
         if (!UNIT(s)->default_dependencies)
                 return 0;
 
         /* Make sure scopes are unloaded on shutdown */
-        r = unit_add_two_dependencies_by_name(
-                        UNIT(s),
-                        UNIT_BEFORE, UNIT_CONFLICTS,
-                        SPECIAL_SHUTDOWN_TARGET, true,
-                        UNIT_DEPENDENCY_DEFAULT);
-        if (r < 0)
-                return r;
+        if (!UNIT(s)->ignore_on_soft_reboot)
+                return unit_add_two_dependencies_by_name(
+                                UNIT(s),
+                                UNIT_BEFORE, UNIT_CONFLICTS,
+                                SPECIAL_SHUTDOWN_TARGET, true,
+                                UNIT_DEPENDENCY_DEFAULT);
 
-        return 0;
+        /* Unless we are meant to survive soft reboot, in which case we need to conflict with
+         * non-soft-reboot targets. */
+        return unit_add_dependencies_on_real_shutdown_targets(UNIT(s));
 }
 
 static int scope_verify(Scope *s) {
index 1b0af40b4113116dc8f86c14c025433c431d4071..db289c7fbfabfd3a968ddbcf2ea8ef2d7abc3a2b 100644 (file)
@@ -722,11 +722,16 @@ static int service_add_default_dependencies(Service *s) {
          * majority of services. */
 
         if (MANAGER_IS_SYSTEM(UNIT(s)->manager)) {
-                /* First, pull in the really early boot stuff, and
-                 * require it, so that we fail if we can't acquire
-                 * it. */
-
-                r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SYSINIT_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
+                /* First, pull in the really early boot stuff, and require it, so that we fail if we can't
+                 * acquire it. But only add ordering if this is meant to survive a soft reboot, otherwise
+                 * it will be pulled down. */
+
+                r = unit_add_two_dependencies_by_name(UNIT(s),
+                                UNIT_AFTER,
+                                UNIT(s)->ignore_on_soft_reboot ? -EINVAL : UNIT_REQUIRES,
+                                SPECIAL_SYSINIT_TARGET,
+                                true,
+                                UNIT_DEPENDENCY_DEFAULT);
                 if (r < 0)
                         return r;
         } else {
@@ -747,7 +752,17 @@ static int service_add_default_dependencies(Service *s) {
                 return r;
 
         /* Third, add us in for normal shutdown. */
-        return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
+        if (!UNIT(s)->ignore_on_soft_reboot)
+                return unit_add_two_dependencies_by_name(UNIT(s),
+                                UNIT_BEFORE,
+                                UNIT_CONFLICTS,
+                                SPECIAL_SHUTDOWN_TARGET,
+                                true,
+                                UNIT_DEPENDENCY_DEFAULT);
+
+        /* Unless we are meant to survive soft reboot, in which case we need to conflict with
+         * non-soft-reboot targets. */
+        return unit_add_dependencies_on_real_shutdown_targets(UNIT(s));
 }
 
 static void service_fix_stdio(Service *s) {
index 490aabfd35ebe4ad3ede038030d1aafe53424256..069bfe1ea8901de2ac3e3ed5b21e672d6b58e7cd 100644 (file)
@@ -64,22 +64,22 @@ static int slice_add_parent_slice(Slice *s) {
 }
 
 static int slice_add_default_dependencies(Slice *s) {
-        int r;
-
         assert(s);
 
         if (!UNIT(s)->default_dependencies)
                 return 0;
 
         /* Make sure slices are unloaded on shutdown */
-        r = unit_add_two_dependencies_by_name(
-                        UNIT(s),
-                        UNIT_BEFORE, UNIT_CONFLICTS,
-                        SPECIAL_SHUTDOWN_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
-        if (r < 0)
-                return r;
-
-        return 0;
+        if (!UNIT(s)->ignore_on_soft_reboot)
+                return unit_add_two_dependencies_by_name(
+                                UNIT(s),
+                                UNIT_BEFORE, UNIT_CONFLICTS,
+                                SPECIAL_SHUTDOWN_TARGET, true,
+                                UNIT_DEPENDENCY_DEFAULT);
+
+        /* Unless we are meant to survive soft reboot, in which case we need to conflict with
+         * non-soft-reboot targets. */
+        return unit_add_dependencies_on_real_shutdown_targets(UNIT(s));
 }
 
 static int slice_verify(Slice *s) {
index 03b8cbd164a403fc1a8f0af92397fe6646c4bfa0..05a5e31be9801a8faa59a7f740f85e4cc978bce5 100644 (file)
@@ -278,12 +278,24 @@ static int socket_add_default_dependencies(Socket *s) {
                 return r;
 
         if (MANAGER_IS_SYSTEM(UNIT(s)->manager)) {
-                r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SYSINIT_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
+                r = unit_add_two_dependencies_by_name(UNIT(s),
+                                UNIT_AFTER,
+                                UNIT(s)->ignore_on_soft_reboot ? -EINVAL : UNIT_REQUIRES,
+                                SPECIAL_SYSINIT_TARGET,
+                                true,
+                                UNIT_DEPENDENCY_DEFAULT);
                 if (r < 0)
                         return r;
         }
 
-        return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
+        if (!UNIT(s)->ignore_on_soft_reboot)
+                return unit_add_two_dependencies_by_name(
+                                UNIT(s),
+                                UNIT_BEFORE, UNIT_CONFLICTS,
+                                SPECIAL_SHUTDOWN_TARGET, true,
+                                UNIT_DEPENDENCY_DEFAULT);
+
+        return unit_add_dependencies_on_real_shutdown_targets(UNIT(s));
 }
 
 _pure_ static bool socket_has_exec(Socket *s) {
index 3519b4b653a05b1a4b6ca63bc42811e3c67ce083..3cb17b9843489b7943a378a14e02a35e7284c723 100644 (file)
@@ -66,7 +66,16 @@ static int target_add_default_dependencies(Target *t) {
                 return 0;
 
         /* Make sure targets are unloaded on shutdown */
-        return unit_add_two_dependencies_by_name(UNIT(t), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
+        if (!UNIT(t)->ignore_on_soft_reboot)
+                return unit_add_two_dependencies_by_name(
+                                UNIT(t),
+                                UNIT_BEFORE, UNIT_CONFLICTS,
+                                SPECIAL_SHUTDOWN_TARGET, true,
+                                UNIT_DEPENDENCY_DEFAULT);
+
+        /* Unless we are meant to survive soft reboot, in which case we need to conflict with
+         * non-soft-reboot targets. */
+        return unit_add_dependencies_on_real_shutdown_targets(UNIT(t));
 }
 
 static int target_load(Unit *u) {
index f6e660550749814df23e167771335d9cf6ce5461..3aaebe72c68b14c6b0f35295a605084015d55a97 100644 (file)
@@ -94,7 +94,12 @@ static int timer_add_default_dependencies(Timer *t) {
                 return r;
 
         if (MANAGER_IS_SYSTEM(UNIT(t)->manager)) {
-                r = unit_add_two_dependencies_by_name(UNIT(t), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SYSINIT_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
+                r = unit_add_two_dependencies_by_name(UNIT(t),
+                                UNIT_AFTER,
+                                UNIT(t)->ignore_on_soft_reboot ? -EINVAL : UNIT_REQUIRES,
+                                SPECIAL_SYSINIT_TARGET,
+                                true,
+                                UNIT_DEPENDENCY_DEFAULT);
                 if (r < 0)
                         return r;
 
@@ -112,7 +117,14 @@ static int timer_add_default_dependencies(Timer *t) {
                 }
         }
 
-        return unit_add_two_dependencies_by_name(UNIT(t), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
+        if (!UNIT(t)->ignore_on_soft_reboot)
+                return unit_add_two_dependencies_by_name(
+                                UNIT(t),
+                                UNIT_BEFORE, UNIT_CONFLICTS,
+                                SPECIAL_SHUTDOWN_TARGET, true,
+                                UNIT_DEPENDENCY_DEFAULT);
+
+        return unit_add_dependencies_on_real_shutdown_targets(UNIT(t));
 }
 
 static int timer_add_trigger_dependencies(Timer *t) {
index ffc063a6842106cf7dcc58dd9379f546f228d71a..e47ddf0dd4ea2561b86a843ed80e30ae0190093d 100644 (file)
@@ -628,7 +628,7 @@ static int transaction_apply(
                 HASHMAP_FOREACH(j, m->jobs) {
                         assert(j->installed);
 
-                        if (j->unit->ignore_on_isolate)
+                        if (j->unit->ignore_on_isolate || j->unit->ignore_on_soft_reboot)
                                 continue;
 
                         if (hashmap_contains(tr->jobs, j->unit))
@@ -1159,6 +1159,9 @@ static bool shall_stop_on_isolate(Transaction *tr, Unit *u) {
         if (u->ignore_on_isolate)
                 return false;
 
+        if (u->ignore_on_soft_reboot)
+                return false;
+
         /* Is there already something listed for this? */
         if (hashmap_contains(tr->jobs, u))
                 return false;
index cb209c5bde8ee64fbf63815579fdda97682c3fdf..e96af7163464357f179c862ea564b39ac5607fc8 100644 (file)
@@ -830,6 +830,7 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
                         "%s\tRefuseManualStart: %s\n"
                         "%s\tRefuseManualStop: %s\n"
                         "%s\tDefaultDependencies: %s\n"
+                        "%s\tIgnoreOnSoftReboot: %s\n"
                         "%s\tOnSuccessJobMode: %s\n"
                         "%s\tOnFailureJobMode: %s\n"
                         "%s\tIgnoreOnIsolate: %s\n",
@@ -837,6 +838,7 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
                         prefix, yes_no(u->refuse_manual_start),
                         prefix, yes_no(u->refuse_manual_stop),
                         prefix, yes_no(u->default_dependencies),
+                        prefix, yes_no(u->ignore_on_soft_reboot),
                         prefix, job_mode_to_string(u->on_success_job_mode),
                         prefix, job_mode_to_string(u->on_failure_job_mode),
                         prefix, yes_no(u->ignore_on_isolate));
index 6792bda9d01a6c22a659754e565a068e76e5acbd..468b193acd57fca1b67955270e31a34ce390c31d 100644 (file)
@@ -3291,21 +3291,48 @@ int unit_add_dependency(
 }
 
 int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference, UnitDependencyMask mask) {
-        int r, s;
+        int r = 0, s = 0;
 
         assert(u);
+        assert(d >= 0 || e >= 0);
 
-        r = unit_add_dependency(u, d, other, add_reference, mask);
-        if (r < 0)
-                return r;
+        if (d >= 0) {
+                r = unit_add_dependency(u, d, other, add_reference, mask);
+                if (r < 0)
+                        return r;
+        }
 
-        s = unit_add_dependency(u, e, other, add_reference, mask);
-        if (s < 0)
-                return s;
+        if (e >= 0) {
+                s = unit_add_dependency(u, e, other, add_reference, mask);
+                if (s < 0)
+                        return s;
+        }
 
         return r > 0 || s > 0;
 }
 
+int unit_add_dependencies_on_real_shutdown_targets(Unit *u) {
+        int r;
+
+        assert(u);
+
+        STRV_FOREACH(target, STRV_MAKE(SPECIAL_REBOOT_TARGET,
+                                SPECIAL_KEXEC_TARGET,
+                                SPECIAL_HALT_TARGET,
+                                SPECIAL_POWEROFF_TARGET)) {
+                r = unit_add_two_dependencies_by_name(u,
+                                UNIT_BEFORE,
+                                UNIT_CONFLICTS,
+                                *target,
+                                /* add_reference= */ true,
+                                UNIT_DEPENDENCY_DEFAULT);
+                if (r < 0)
+                        return r;
+        }
+
+        return 0;
+}
+
 static int resolve_template(Unit *u, const char *name, char **buf, const char **ret) {
         int r;
 
index c0710299a54a964b68fb9284b97049876c8ddaa6..6aa8b82ed87ffc3e72818bbbfa2556066a50c2e9 100644 (file)
@@ -450,6 +450,9 @@ typedef struct Unit {
         /* Create default dependencies */
         bool default_dependencies;
 
+        /* Configure so that the unit survives a soft reboot without stopping/starting. */
+        bool ignore_on_soft_reboot;
+
         /* Refuse manual starting, allow starting only indirectly via dependency. */
         bool refuse_manual_start;
 
@@ -852,6 +855,8 @@ int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, boo
 int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, bool add_reference, UnitDependencyMask mask);
 
 int unit_add_exec_dependencies(Unit *u, ExecContext *c);
+/* Helper for IgnoreOnSoftReboot units that need to survive soft-reboot.target but not others */
+int unit_add_dependencies_on_real_shutdown_targets(Unit *u);
 
 int unit_choose_id(Unit *u, const char *name);
 int unit_set_description(Unit *u, const char *description);
index e7b44cc39bac7e552389143944e2cb0be294e625..8258ee3aaa6c61296a857f0927158a22e2f44fe4 100644 (file)
@@ -2521,6 +2521,7 @@ static int bus_append_unit_property(sd_bus_message *m, const char *field, const
                               "RefuseManualStop",
                               "AllowIsolate",
                               "IgnoreOnIsolate",
+                              "IgnoreOnSoftReboot",
                               "DefaultDependencies"))
                 return bus_append_parse_boolean(m, field, eq);
 
index a1c82a9fc9d0f87f101886e4eec5220ac0d1c9e2..a425d21c96ae8d589741a59aadc69f6036ed202c 100755 (executable)
@@ -136,11 +136,10 @@ rm "$T"
 exec sleep infinity
 EOF
     chmod +x "$T"
-    # This sets DefaultDependencies=no so that it remains running until the
-    # very end, and IgnoreOnIsolate=yes so that it isn't stopped via the
-    # "testsuite.target" isolation we do on next boot
-    systemd-run -p Type=notify -p DefaultDependencies=no -p IgnoreOnIsolate=yes --unit=testsuite-82-survive.service "$T"
-    systemd-run -p Type=exec -p DefaultDependencies=no -p IgnoreOnIsolate=yes --unit=testsuite-82-nosurvive.service sleep infinity
+    # Configure this transient unit to survive the soft reboot - it will not conflict with shutdown.target
+    # and it will be ignored on the isolate that happens in the next boot.
+    systemd-run -p Type=notify -p IgnoreOnSoftReboot=yes --unit=testsuite-82-survive.service "$T"
+    systemd-run -p Type=exec -p IgnoreOnSoftReboot=yes --unit=testsuite-82-nosurvive.service sleep infinity
 
     # Now issue the soft reboot. We should be right back soon.
     touch /run/testsuite82.touch