fix(restart-app): wait for SIGTERM to take effect before respawning
Previous behavior: `pkill -x $1` (no wait) followed by an immediate
background `setsid uwsm-app`. The new instance attached its wayland
surface while the old one's surface was still mapped. Layer-shell
apps got the same visible ghosting that waybar showed on theme switch
before the SIGUSR2 fix (386da51), and non-layer apps got brief double
instances.
Fix:
- Quote $1 (was unquoted, breaks if app name has whitespace - rare
but cost-free to fix while we're here).
- After SIGTERM, poll pgrep for up to ~1.5s in 100ms ticks.
- If anything is still alive after the poll window, SIGKILL it -
prevents a misbehaving process from holding the surface forever.
- Only spawn the new instance after the old one is confirmed gone.
Affects every caller that hits the non-systemd-managed restart path
(menu's update-process actions, voxtype install/remove, font-change
follow-ups, etc.).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -2,6 +2,28 @@
|
|||||||
|
|
||||||
# Restart an application by killing it and relaunching via uwsm.
|
# Restart an application by killing it and relaunching via uwsm.
|
||||||
# Usage: nomarchy-restart-app <application-name> [application-args...]
|
# Usage: nomarchy-restart-app <application-name> [application-args...]
|
||||||
|
#
|
||||||
|
# We wait for the old process to actually exit before launching the
|
||||||
|
# new one. Without the wait, the new instance starts while the old
|
||||||
|
# one's wayland surface is still mapped — visible as ghosting on
|
||||||
|
# layer-shell apps and double-instance briefly for everything else.
|
||||||
|
# Same race that produced the waybar theme-switch artifacts before
|
||||||
|
# 386da51 moved waybar to a SIGUSR2-reload path.
|
||||||
|
|
||||||
pkill -x $1
|
app="$1"
|
||||||
setsid uwsm-app -- "$@" >/dev/null 2>&1 &
|
shift || true
|
||||||
|
|
||||||
|
if pgrep -x "$app" >/dev/null 2>&1; then
|
||||||
|
pkill -x "$app" 2>/dev/null || true
|
||||||
|
# Poll for graceful exit, up to ~1.5s.
|
||||||
|
for _ in $(seq 1 15); do
|
||||||
|
pgrep -x "$app" >/dev/null 2>&1 || break
|
||||||
|
sleep 0.1
|
||||||
|
done
|
||||||
|
# Anything still running: SIGKILL it. Without this, a misbehaving
|
||||||
|
# process can hold the surface indefinitely and the new instance
|
||||||
|
# races on top.
|
||||||
|
pkill -KILL -x "$app" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
setsid uwsm-app -- "$app" "$@" >/dev/null 2>&1 &
|
||||||
|
|||||||
Reference in New Issue
Block a user