]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
run: honor --no-block for trigger units
authordongshengyuan <545258830@qq.com>
Mon, 13 Jul 2026 05:54:14 +0000 (13:54 +0800)
committerdongshengyuan <545258830@qq.com>
Tue, 14 Jul 2026 04:03:22 +0000 (12:03 +0800)
Reproducer:
  unit=run-nb-trigger-$(date +%s)
  systemd-run --no-block --collect --unit="$unit" \
      --socket-property=ListenStream=/proc/systemd-run-repro/socket \
      /usr/bin/true
  echo $?

Before, systemd-run still waited for the trigger unit job and
propagated the socket start failure. With --no-block it should only
verify and enqueue the request, as the service path already does.

Follow-up for 3d161f991e16369aa59f447eb4cdb90af33261c8

src/run/run.c
test/units/TEST-74-AUX-UTILS.run.sh

index 63c0718ad94a2633bb8a23047f4a1334260eb341..ac6d3c01961aafdf5157f5c04fdcc8c0433df38a 100644 (file)
@@ -2808,9 +2808,11 @@ static int start_transient_trigger(sd_bus *bus, const char *suffix) {
         assert(bus);
         assert(suffix);
 
-        r = bus_wait_for_jobs_new(bus, &w);
-        if (r < 0)
-                return log_error_errno(r, "Could not watch jobs: %m");
+        if (!arg_no_block) {
+                r = bus_wait_for_jobs_new(bus, &w);
+                if (r < 0)
+                        return log_error_errno(r, "Could not watch jobs: %m");
+        }
 
         if (arg_unit) {
                 switch (unit_name_to_type(arg_unit)) {
@@ -2875,10 +2877,12 @@ static int start_transient_trigger(sd_bus *bus, const char *suffix) {
         if (r < 0)
                 return bus_log_parse_error(r);
 
-        r = bus_wait_for_jobs_one(w, object, arg_quiet ? 0 : BUS_WAIT_JOBS_LOG_ERROR,
-                                  arg_runtime_scope == RUNTIME_SCOPE_USER ? STRV_MAKE_CONST("--user") : NULL);
-        if (r < 0)
-                return r;
+        if (w) {
+                r = bus_wait_for_jobs_one(w, object, arg_quiet ? 0 : BUS_WAIT_JOBS_LOG_ERROR,
+                                          arg_runtime_scope == RUNTIME_SCOPE_USER ? STRV_MAKE_CONST("--user") : NULL);
+                if (r < 0)
+                        return r;
+        }
 
         if (!arg_quiet) {
                 log_info("Running %s as unit: %s", suffix + 1, trigger);
index bdb0fd1a7eb061b39c9e2ffe1700fff01e1cc05b..ec73a0bd1c40417d2b609336400e1c839ada45e4 100755 (executable)
@@ -205,6 +205,13 @@ grep -q "^SocketMode=0644$" "/run/systemd/transient/$UNIT.socket"
 grep -qE "^ExecStart=.*true.*$" "/run/systemd/transient/$UNIT.service"
 systemctl stop "$UNIT.socket" "$UNIT.service" || :
 
+UNIT="socket-no-block-$RANDOM"
+systemd-run --no-block --collect \
+            --unit="$UNIT" \
+            --socket-property=ListenStream=/proc/systemd-run-repro/socket \
+            true
+systemctl stop "$UNIT.socket" "$UNIT.service" || :
+
 : "Job mode"
 systemd-run --job-mode=help
 (! systemd-run --job-mode=foo --scope true)