diff --git a/extra-repos/systemd/systemd/APKBUILD b/extra-repos/systemd/systemd/APKBUILD
index c1120f7b728f33147f685b5d377a61f1755ae284..976d6a521a6cc93c897b839fc2077a89e75e0620 100644
--- a/extra-repos/systemd/systemd/APKBUILD
+++ b/extra-repos/systemd/systemd/APKBUILD
@@ -6,16 +6,13 @@ pkgname=systemd
 # currently tracking git MR
 pkgver=256.11
 _pkgver="musl-v${pkgver//_/-}-split-usr"
-pkgrel=4
+pkgrel=5
 pkgdesc="System and service manager"
 url="https://github.com/systemd/systemd"
 arch="all !ppc64le !s390x" # blocked by pmboostrap not supporting
 license="MIT AND GPL-2.0-only AND LGPL-2.1-or-later"
 options="pmb:strict !check" # few tests fail, need to debug. We use alpine dbus for building, systemd-dbus for runtime
 
-# FIXME: it turns out abuild doesn't let you have arbitrary triggers?! what century is this???
-# So we have to trigger everything on everything and do a bunch of reloading that
-# isn't necessary most of the time...
 triggers="$pkgname.trigger=/usr/lib/systemd/catalog:\
 /usr/lib/udev/hwdb.d:\
 /usr/lib/binfmt.d:\
diff --git a/extra-repos/systemd/systemd/systemd.trigger b/extra-repos/systemd/systemd/systemd.trigger
index fabefeeba84b9ad030dcd13fe9e425825ac01823..213d2aded237cb963dc281774cd3940a396ae571 100644
--- a/extra-repos/systemd/systemd/systemd.trigger
+++ b/extra-repos/systemd/systemd/systemd.trigger
@@ -1,62 +1,107 @@
 #!/bin/sh
+# When adding new paths to trigger on here, make sure to also add them in
+# triggers= in the APKBUILD.
+TRIGGERPATHS="$*"
+SYSTEM_SERVICES_CHANGED=false
+USER_SERVICES_CHANGED=false
 
 # All the things we can do even if systemd isn't running
+trigger_always() {
+	for triggerpath in $TRIGGERPATHS; do
+		case "$triggerpath" in
+			/usr/lib/systemd/catalog)
+				echo "Running journalctl --update-catalog..."
+				journalctl --update-catalog
+				;;
+			/usr/lib/udev/hwdb.d)
+				echo "Running systemd-hwdb update..."
+				systemd-hwdb update
+				;;
+			/usr/lib/sysusers.d)
+				echo "Running systemd-sysusers..."
+				systemd-sysusers
+				;;
+			/usr/lib/systemd/system|/etc/systemd/system)
+				SYSTEM_SERVICES_CHANGED=true
+				;;
+			/usr/lib/systemd/user|/etc/systemd/user)
+				USER_SERVICES_CHANGED=true
+				;;
+		esac
+	done
+}
 
-# Update journald catalog
-# FIXME: trigger only on /usr/lib/systemd/catalog
-journalctl --update-catalog || :
+trigger_systemd_running() {
+	for triggerpath in $TRIGGERPATHS; do
+		case "$triggerpath" in
+			/usr/lib/binfmt.d)
+				echo "Running systemd-binfmt..."
+				/usr/lib/systemd/systemd-binfmt
+				;;
+			/usr/lib/tmpfiles.d)
+				echo "Running systemd-tmpfiles --create..."
+				systemd-tmpfiles --create
+				;;
+			/usr/lib/udev/rules.d)
+				# We can't do this as a trigger for the udevd
+				# subpackage because it might end up running AFTER the
+				# systemd trigger.
+				echo "Marking systemd-udevd for reload..."
+				systemctl set-property systemd-udevd.service Markers=+needs-reload
+				;;
+			/usr/lib/sysctl.d)
+				echo "Running systemd-sysctl..."
+				/usr/lib/systemd/systemd-sysctl
+				;;
+		esac
+	done
+}
 
-# Update the hwdb if it was modified
-# FIXME: trigger only on /usr/lib/udev/hwdb.d
-systemd-hwdb update || :
+trigger_user_and_system_services() {
+	if $SYSTEM_SERVICES_CHANGED || $USER_SERVICES_CHANGED; then
+		echo "Running systemd daemon-reload..."
+		systemctl daemon-reload
+	fi
 
-# Process new sysusers
-# FIXME: trigger only on /usr/lib/sysusers.d
-systemd-sysusers || :
+	# This doesn't do anything yet but will trigger a daemon-reexec once we
+	# upgrade to systemd 257:
+	# https://github.com/systemd/systemd/commit/a375e145190482e8a2f0971bffb332e31211622f
+	if $USER_SERVICES_CHANGED; then
+		echo "Running systemd reload user@*.service..."
+		systemctl reload "user@*.service"
+	fi
 
-# OK, if systemd isn't running then we're done, else we have more
-# to do!
+	# Reload or restart marked system units. Units get marked in their
+	# respective package post-upgrade scripts
+	if $SYSTEM_SERVICES_CHANGED; then
+		echo "Reloading/restarting marked system services..."
+		systemctl reload-or-restart --marked
+	fi
+
+	if $USER_SERVICES_CHANGED; then
+		local uids
+		uids="$(systemctl list-units 'user@*' --legend=no \
+				| sed -n -r 's/.*user@([0-9]+).service.*/\1/p')"
+		for uid in $uids; do
+			echo "Reloading/restarting marked user services for uid=$uid..."
+			systemctl \
+				--user \
+				-M "$uid@" \
+				reload-or-restart \
+				--marked &
+		done
+		wait
+	fi
+}
+
+trigger_always
 
 if ! [ -d "/run/systemd/system" ]; then
+	echo "Skipping other triggers because systemd isn't running"
 	exit 0
 fi
 
-# Can fail if binfmt_misc is not loaded
-# FIXME: trigger only on /usr/lib/binfmt.d
-/usr/lib/systemd/systemd-binfmt || :
-
-# Create new tmpfiles
-# FIXME: trigger only on /usr/lib/tmpfiles.d
-systemd-tmpfiles --create
-
-# FIXME: trigger only on /usr/lib/udev/rules.d
-# We can't do this as a trigger for the udevd subpackage because it might
-# end up running AFTER the systemd trigger. Urgh!
-systemctl set-property systemd-udevd.service Markers=+needs-reload &
-
-# FIXME: trigger only on /usr/lib/sysctl.d
-/usr/lib/systemd/systemd-sysctl || :
-
-# FIXME: the rest of this should trigger on. The system and user parts
-# could trigger separately but the ordering is still important (systemd
-# itself should be reloaded at the system and user level before services
-# are reloaded or restarted).
-# /usr/lib/systemd/system:/usr/lib/systemd/user:/etc/systemd/system:/etc/systemd/user
-
-# First do a system-wide daemon-reload
-systemctl daemon-reload
-
-# And reload the user services. This doesn't do anything yet but will trigger
-# a daemon-reexec once we upgrade to systemd 257. See
-# https://github.com/systemd/systemd/commit/a375e145190482e8a2f0971bffb332e31211622f
-systemctl reload "user@*.service"
-
-# Then reload or restart marked system units. Units get marked in their respective
-# package post-upgrade scripts
-systemctl reload-or-restart --marked
-
-users=$(systemctl list-units 'user@*' --legend=no | sed -n -r 's/.*user@([0-9]+).service.*/\1/p')
-for user in $users; do
-	systemctl --user -M "$user@" reload-or-restart --marked &
-done
-wait
+trigger_systemd_running
+trigger_user_and_system_services
+
+exit 0