Skip to main content

max / alloy

Stop the greeter coming back for one second on the way down
Author: Max Johnson <me@maxj.phd> · 2026-09-03 19:40 UTC
Signed with PGP, not checked
Commit: ab852586d3202d6c39e98b44814b505f53b4ada0
Parent: cf849b4
1 file changed, +32 insertions, -0 deletions
@@ -1,0 +1,32 @@
1 + # Do not bring the greeter back while the machine is going down.
2 + #
3 + # Reported by Max 2026-09-03: rebooting flashes the login screen with garbled
4 + # colours and what looks like text pasted into the username field, and only
5 + # then reboots. Measured in fw12's shutdown journal rather than guessed:
6 + #
7 + # greetd[2434]: session opened for user greeter
8 + # greetd: pam_systemd: Failed to issue CreateSession() varlink call
9 + # systemd[1]: Stopping greetd.service - Greeter daemon...
10 + # systemd[1]: Stopped alloy-vtrgb.service - Alloy console palette (Akari).
11 + #
12 + # All in the same second. The session ending for the reboot is an ordinary
13 + # session exit as far as greetd is concerned, so `Restart=always` respawns it,
14 + # and the vendor unit's `Conflicts=shutdown.target` only stops it once the
15 + # shutdown transaction reaches it. In that window a fresh tuigreet draws on
16 + # VT1 while systemd's own shutdown messages are writing to the same console
17 + # and alloy-vtrgb is being torn down. The greeter's theme names ANSI slots
18 + # that alloy-vtrgb defines (see etc/greetd/config.toml), so a greeter drawn
19 + # after it stops is painted in the console's stock palette, which is the
20 + # "artifacting". `--remember` supplies the username sitting in the field.
21 + #
22 + # Conflicts= cannot fix this: it fires when a start job is ENQUEUED, which is
23 + # the trap 10-installer-medium.conf already records paying for. This refuses
24 + # the start instead, which is the only half of the race Alloy owns.
25 + #
26 + # `is-system-running` reports `stopping` from the moment the shutdown
27 + # transaction begins, so this is false exactly during shutdown and true on
28 + # every ordinary logout, which must still return to the greeter. systemd
29 + # retries under Restart= until the shutdown job stops the unit; those retries
30 + # write nothing to the console, which is the whole point.
31 + [Service]
32 + ExecStartPre=/bin/sh -c '[ "$(systemctl is-system-running)" != stopping ]'