Improve dinit service files (#3193)

* Improve dinit service files and niri-session

Two main changes were made:
 - After a discussion in davmac314/dinit#496, 2 dinit services are now
   provided. The first one is 'niri', which runs niri itself, and the
   second one is 'niri.target' which brings up all the dependences from
   user configuration.
 - Made the behaviour of 'niri-session' when running under dinit closer
   to the behaviour when running under systemd. In particular, now the
   script wait for service completion, because some login managers shut
   the session down the moment the startup script completes.

* Update paths in docs
This commit is contained in:
Mark Karlinsky
2026-01-04 09:04:03 +02:00
committed by GitHub
parent 3158f5a9c0
commit 3bfa4a71ff
6 changed files with 41 additions and 15 deletions
+1 -1
View File
@@ -223,7 +223,7 @@ This defaults to `/usr/bin/niri`.
| `resources/niri.service` (systemd) | `/etc/systemd/user/` | | `resources/niri.service` (systemd) | `/etc/systemd/user/` |
| `resources/niri-shutdown.target` (systemd) | `/etc/systemd/user/` | | `resources/niri-shutdown.target` (systemd) | `/etc/systemd/user/` |
| `resources/dinit/niri` (dinit) | `/etc/dinit.d/user/` | | `resources/dinit/niri` (dinit) | `/etc/dinit.d/user/` |
| `resources/dinit/niri-shutdown` (dinit) | `/etc/dinit.d/user/` | | `resources/dinit/niri.target` (dinit) | `/etc/dinit.d/user/` |
[Alacritty]: https://github.com/alacritty/alacritty [Alacritty]: https://github.com/alacritty/alacritty
[fuzzel]: https://codeberg.org/dnkl/fuzzel [fuzzel]: https://codeberg.org/dnkl/fuzzel
+1 -1
View File
@@ -24,7 +24,7 @@ To do that, put files into the correct directories according to this table.
| `resources/niri.service` (systemd) | `/usr/lib/systemd/user/` | | `resources/niri.service` (systemd) | `/usr/lib/systemd/user/` |
| `resources/niri-shutdown.target` (systemd) | `/usr/lib/systemd/user/` | | `resources/niri-shutdown.target` (systemd) | `/usr/lib/systemd/user/` |
| `resources/dinit/niri` (dinit) | `/usr/lib/dinit.d/user/` | | `resources/dinit/niri` (dinit) | `/usr/lib/dinit.d/user/` |
| `resources/dinit/niri-shutdown` (dinit) | `/usr/lib/dinit.d/user/` | | `resources/dinit/niri.target` (dinit) | `/usr/lib/dinit.d/user/` |
Doing this will make niri appear in GDM and other display managers. Doing this will make niri appear in GDM and other display managers.
+3 -4
View File
@@ -2,7 +2,6 @@ type = process
command = niri --session command = niri --session
restart = false restart = false
working-dir = $HOME working-dir = $HOME
depends-on = dbus ready-notification = pipevar:NOTIFY_FD
after = niri-shutdown logfile = $HOME/.local/share/niri/niri.log
chain-to = niri-shutdown depends-on: dbus
options: always-chain
-3
View File
@@ -1,3 +0,0 @@
type = scripted
command = dinitctl -u setenv WAYLAND_DISPLAY= XDG_SESSION_TYPE= XDG_CURRENT_DESKTOP= NIRI_SOCKET=
restart = false
+6
View File
@@ -0,0 +1,6 @@
type = internal
restart = false
depends-on: niri
waits-for.d: $XDG_CONFIG_HOME/dinit.d/niri.d/
waits-for.d: $HOME/.config/dinit.d/niri.d/
waits-for.d: /etc/dinit.d/user/niri.d/
+26 -2
View File
@@ -59,13 +59,37 @@ elif hash dinitctl >/dev/null 2>&1; then
fi fi
# Make sure there's no already running session. # Make sure there's no already running session.
if dinitctl --user is-started niri >/dev/null 2>&1; then if dinitctl --quiet --user is-started niri 2>/dev/null; then
echo 'A niri session is already running.' echo 'A niri session is already running.'
exit 1 exit 1
fi fi
# Import the login manager environment into dinit
# Might not work correctly for multiline variable names, but
# it is reasonable to assume there are none
awk 'BEGIN{for(v in ENVIRON) if (v != "AWKPATH" && v != "AWKLIBPATH") print v}' 2>/dev/null | xargs dinitctl --quiet --user setenv 2>/dev/null
# Usually the dbus service would start as niri's dependency and inherit
# environment from dinit, but in case it has already started we need
# to update its environment.
if hash dbus-update-activation-environment >/dev/null 2>&1; then
dbus-update-activation-environment --all >/dev/null 2>&1
fi
# Create the directory for the logfile, if doesn't exist
mkdir --parents $HOME/.local/share/niri
# Start niri # Start niri
dinitctl --user start niri dinitctl --quiet --user start niri.target 2>&1
# Wait for termination
dinit-monitor --user --initial -c $'sh -c "
if [ "%s" = "stopped" ] || [ "%s" = "failed" ]; then
ppid=$(ps -o ppid= -p $$)
kill $ppid
fi"' niri >/dev/null 2>&1
# Unset environment that we've set.
dinitctl --quiet --user unsetenv WAYLAND_DISPLAY DISPLAY XDG_SESSION_TYPE XDG_CURRENT_DESKTOP NIRI_SOCKET 2>/dev/null
else else
echo "No systemd or dinit detected, please use niri --session instead." echo "No systemd or dinit detected, please use niri --session instead."
fi fi