Reload services and the running session after install

This commit is contained in:
SirBlob committed 2026-09-24 02:43:38 +00:00
1 parent 9d373a7dc6
commit 96325ff74d
4 files changed
+98 -3

No files matched your search

+2 -1
View File
@@ -83,7 +83,8 @@ It runs these steps, in this order, and every one of them is idempotent:
| 7. systemd drop-ins | writes the shutdown timeouts, oomd thresholds, plocate prune paths, and sleep hooks under `/etc` | | 7. systemd drop-ins | writes the shutdown timeouts, oomd thresholds, plocate prune paths, and sleep hooks under `/etc` |
| 8. System services | enables NetworkManager, resolved, bluetooth, cups, avahi, docker, power-profiles-daemon, and oomd, and masks `NetworkManager-wait-online` | | 8. System services | enables NetworkManager, resolved, bluetooth, cups, avahi, docker, power-profiles-daemon, and oomd, and masks `NetworkManager-wait-online` |
| 9. Login screen | installs the session entry and the SDDM config, enables `sddm.service`, and sets the default target to `graphical.target` | | 9. Login screen | installs the session entry and the SDDM config, enables `sddm.service`, and sets the default target to `graphical.target` |
| 10. Launch | starts the login screen, so the desktop comes up without a reboot | | 10. Reload | reloads systemd, restarts the running user services, and in a running session re-renders the theme, reloads Hyprland, and restarts the Blob shell |
| 11. Launch | starts the login screen, so the desktop comes up without a reboot |
Step 9 is the one a plain Arch install cannot do without: SDDM's stock Wayland Step 9 is the one a plain Arch install cannot do without: SDDM's stock Wayland
greeter runs on `weston`, which Blob does not install, so the greeter is pointed greeter runs on `weston`, which Blob does not install, so the greeter is pointed
+10 -1
View File
@@ -17,6 +17,7 @@ with `--check`.
| `install/steps/services.sh` | system services, systemd drop-ins, user units | | `install/steps/services.sh` | system services, systemd drop-ins, user units |
| `install/steps/theme.sh` | the wallpaper link, the first theme, the first background | | `install/steps/theme.sh` | the wallpaper link, the first theme, the first background |
| `install/steps/login.sh` | SDDM, the session entry, and the first launch | | `install/steps/login.sh` | SDDM, the session entry, and the first launch |
| `install/steps/reload.sh` | reloading systemd, the user services, and a running session |
## Steps ## Steps
@@ -128,7 +129,15 @@ with `--check`.
`--autologin` writes `zzz-blob-autologin.conf`, the only file that sorts after `--autologin` writes `zzz-blob-autologin.conf`, the only file that sorts after
`zz-blob.conf`. `zz-blob.conf`.
10. **Launch.** `sddm`, `hyprland`, `quickshell` and `uwsm` are checked one last 10. **Reload.** systemd re-reads its units and `systemd-oomd` is restarted so
the new drop-ins apply. The user manager is reloaded and every Blob user
service that is running is restarted. When a Hyprland session is running
for this user, the current theme is rendered again with
`blob-theme-refresh`, Hyprland reloads its config, and the Blob shell
restarts, so an install over a live desktop takes effect without logging
out. The shell restart is refused while the screen is locked. Nothing that
was stopped is started, and `--check` only reports what would reload.
11. **Launch.** `sddm`, `hyprland`, `quickshell` and `uwsm` are checked one last
time and any that are missing are named, because that is the whole difference time and any that are missing are named, because that is the whole difference
between a desktop and a console. Then, when the installer was run from a between a desktop and a console. Then, when the installer was run from a
console and nothing graphical is running, it starts `sddm.service` so the console and nothing graphical is running, it starts `sddm.service` so the
+7 -1
View File
@@ -19,7 +19,8 @@ usage() {
Usage: ./install.sh [OPTIONS] Usage: ./install.sh [OPTIONS]
Creates every directory Blob needs, installs the packages that are missing, Creates every directory Blob needs, installs the packages that are missing,
writes the config, enables the services, and opens the login screen. writes the config, enables the services, reloads a running session so every
change takes effect, and opens the login screen.
--check Report what would change, write nothing --check Report what would change, write nothing
--force Overwrite files that have local changes --force Overwrite files that have local changes
@@ -50,6 +51,7 @@ source "$repo_dir/install/steps/config.sh"
source "$repo_dir/install/steps/services.sh" source "$repo_dir/install/steps/services.sh"
source "$repo_dir/install/steps/theme.sh" source "$repo_dir/install/steps/theme.sh"
source "$repo_dir/install/steps/login.sh" source "$repo_dir/install/steps/login.sh"
source "$repo_dir/install/steps/reload.sh"
say "Blob installer" say "Blob installer"
say "repo: $repo_dir" say "repo: $repo_dir"
@@ -88,6 +90,10 @@ report_greeter_compositor
report_login_conflicts report_login_conflicts
report_desktop_essentials report_desktop_essentials
reload_system_services
reload_user_services
reload_session
say "" say ""
if [[ $check == true ]]; then if [[ $check == true ]]; then
say "$changes item(s) would change." say "$changes item(s) would change."
+79
View File
@@ -0,0 +1,79 @@
reloaded_system_services=(
systemd-oomd.service
)
session_running() {
pgrep -u "$UID" -x Hyprland &>/dev/null
}
reload_system_services() {
if [[ $check == true ]]; then
say "would reload systemd and restart ${reloaded_system_services[*]}"
return 0
fi
if ! as_root systemctl daemon-reload; then
say "WARN could not reload systemd"
return 0
fi
local unit
for unit in "${reloaded_system_services[@]}"; do
system_unit_exists "$unit" || continue
as_root systemctl try-restart "$unit" || say "WARN could not restart $unit"
done
say "ok system services reloaded"
}
reload_user_services() {
if ! user_manager_available; then
say "SKIP user services reload (no user systemd manager)"
return 0
fi
if [[ $check == true ]]; then
say "would restart the running user services"
return 0
fi
systemctl --user daemon-reload
local unit failed=()
for unit in "${user_services[@]}"; do
systemctl --user try-restart "$unit" &>/dev/null || failed+=("$unit")
done
if (( ${#failed[@]} > 0 )); then
say "WARN could not restart: ${failed[*]}"
else
say "ok user services reloaded"
fi
}
run_session_reload() {
local label="$1"
shift
if BLOB_PATH="$blob_path" PATH="$blob_path/bin:$PATH" "$@" &>/dev/null; then
say "ok $label reloaded"
else
say "WARN could not reload $label"
fi
}
reload_session() {
if ! session_running; then
say "SKIP session reload (Blob is not running)"
return 0
fi
if [[ $check == true ]]; then
say "would reload the theme, Hyprland, and the Blob shell"
return 0
fi
run_session_reload "theme" blob-theme-refresh
run_session_reload "Hyprland" blob-hypr-restart
run_session_reload "Blob shell" blob-shell-restart
}