summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuca Boccassi <bluca@debian.org>2024-05-31 17:40:12 +0200
committerLuca Boccassi <luca.boccassi@gmail.com>2024-06-03 17:30:54 +0200
commitd6243ebeddec488299efbf6a5b3c840a42c69eb4 (patch)
tree41c47f84c59c45119ea38ce1af042dd61d7c90c8
parentdocs: fix escaped $ in CGroup Interface (diff)
downloadsystemd-d6243ebeddec488299efbf6a5b3c840a42c69eb4.tar.xz
systemd-d6243ebeddec488299efbf6a5b3c840a42c69eb4.zip
journald: enable persistent FD Store to fix logging during soft-reboot
A unit with StandardOutput=journal (the default) will get its stdout/stderr sockets disconnected when journald stops, as the file descriptors on journald's side are not preserved (it works on restart, as the FD Store keeps them open during restarts). Set FileDescriptorStorePreserve=yes so that the journal FD's stay open during a soft reboot, and applications don't get broken stdout/stderr.
-rwxr-xr-xtest/units/TEST-82-SOFTREBOOT.sh5
-rw-r--r--units/systemd-journald.service.in2
2 files changed, 6 insertions, 1 deletions
diff --git a/test/units/TEST-82-SOFTREBOOT.sh b/test/units/TEST-82-SOFTREBOOT.sh
index 0dc4f87a60..f86bc929d0 100755
--- a/test/units/TEST-82-SOFTREBOOT.sh
+++ b/test/units/TEST-82-SOFTREBOOT.sh
@@ -212,6 +212,8 @@ EOF
# Configure these transient units to survive the soft reboot - they will not conflict with shutdown.target
# and it will be ignored on the isolate that happens in the next boot. The first will use argv[0][0] =
# '@', and the second will use SurviveFinalKillSignal=yes. Both should survive.
+ # By writing to stdout, which is connected to the journal, we also ensure logging doesn't break across
+ # soft reboots due to journald being temporarily stopped.
systemd-run --service-type=notify --unit=TEST-82-SOFTREBOOT-survive-argv.service \
--property SurviveFinalKillSignal=no \
--property IgnoreOnIsolate=yes \
@@ -221,6 +223,7 @@ EOF
--property "Before=reboot.target kexec.target poweroff.target halt.target emergency.target rescue.target" \
--property SetCredential=preserve:yay \
"$survive_argv"
+ # shellcheck disable=SC2016
systemd-run --service-type=exec --unit=TEST-82-SOFTREBOOT-survive.service \
--property TemporaryFileSystem="/run /tmp /var" \
--property RootImage=/tmp/minimal_0.raw \
@@ -233,7 +236,7 @@ EOF
--property After=basic.target \
--property "Conflicts=reboot.target kexec.target poweroff.target halt.target emergency.target rescue.target" \
--property "Before=reboot.target kexec.target poweroff.target halt.target emergency.target rescue.target" \
- sleep infinity
+ bash -c 'count=0; while echo "$count"; do count=$[$count +1]; sleep 1; done'
# Check that we can set up an inhibitor, and that busctl monitor sees the
# PrepareForShutdownWithMetadata signal and that it says 'soft-reboot'.
diff --git a/units/systemd-journald.service.in b/units/systemd-journald.service.in
index 96362f5730..4404af963b 100644
--- a/units/systemd-journald.service.in
+++ b/units/systemd-journald.service.in
@@ -32,6 +32,8 @@ IgnoreOnIsolate=yes
DeviceAllow=char-* rw
ExecStart={{LIBEXECDIR}}/systemd-journald
FileDescriptorStoreMax=4224
+# Ensure services using StandardOutput=journal do not break when journald is stopped
+FileDescriptorStorePreserve=yes
ImportCredential=journal.*
IPAddressDeny=any
LockPersonality=yes