fix(update): avoid launchd restart race on macOS

This commit is contained in:
Dave Tist 2026-03-30 04:05:43 +02:00 committed by Teknium
parent 7165eff901
commit 988ecc7420
2 changed files with 13 additions and 30 deletions

View file

@ -3269,8 +3269,8 @@ def cmd_update(args):
from gateway.status import get_running_pid, remove_pid_file
from hermes_cli.gateway import (
get_service_name, get_launchd_plist_path, is_macos, is_linux,
refresh_launchd_plist_if_needed,
_ensure_user_systemd_env, get_systemd_linger_status,
launchd_restart, _ensure_user_systemd_env,
get_systemd_linger_status,
)
import signal as _signal
@ -3374,26 +3374,16 @@ def cmd_update(args):
print(" System services may require root. Try:")
print(f" sudo systemctl restart {_gw_service_name}")
elif has_launchd_service:
# Refresh the plist first (picks up --replace and other
# changes from the update we just pulled).
refresh_launchd_plist_if_needed()
# Explicit stop+start — don't rely on KeepAlive respawn
# after a manual SIGTERM, which would race with the
# PID file cleanup.
# Use the shared launchd restart helper so we wait for the
# old gateway process to fully exit before starting the new
# one. This avoids stop/start races during self-update.
print("→ Restarting gateway service...")
_launchd_label = get_launchd_label()
stop = subprocess.run(
["launchctl", "stop", _launchd_label],
capture_output=True, text=True, timeout=10,
)
start = subprocess.run(
["launchctl", "start", _launchd_label],
capture_output=True, text=True, timeout=10,
)
if start.returncode == 0:
try:
launchd_restart()
print("✓ Gateway restarted via launchd.")
else:
print(f"⚠ Gateway restart failed: {start.stderr.strip()}")
except subprocess.CalledProcessError as e:
stderr = (getattr(e, "stderr", "") or "").strip()
print(f"⚠ Gateway restart failed: {stderr}")
print(" Try manually: hermes gateway restart")
elif existing_pid:
try: