Environment
- OS: macOS 26.3 (arm64)
- OpenClaw: 2026.3.8
- Node: v25.7.0
- Service: LaunchAgent with
KeepAlive=true, ThrottleInterval=1
Steps to Reproduce
- Gateway running as LaunchAgent (installed via
openclaw doctor)
- Run
openclaw gateway restart
Expected Behavior
Gateway stops and restarts within seconds, LaunchAgent plist remains registered.
Actual Behavior
- Stop phase succeeds: SIGTERM sent, process exits, LaunchAgent plist is unloaded (
launchctl bootout)
- Start phase silently fails: plist is not re-registered with launchd
- Gateway stays dead indefinitely — no process, no Telegram, no API
- Only recoverable via manual
openclaw doctor → "Install gateway service? Yes"
Log Evidence
11:56:58 [gateway] signal SIGTERM received
11:56:58 [gateway] received SIGTERM; shutting down
← 4 minute gap, no gateway process →
12:00:51 ← manual `openclaw doctor` required to re-install service →
12:01:00 [gateway] listening on ws://127.0.0.1:18789 (PID 88881)
Contrast: launchctl kill SIGTERM works correctly
Using launchctl kill SIGTERM gui/$(id -u)/ai.openclaw.gateway instead:
- Only kills the process, does not unload the plist
KeepAlive=true triggers launchd auto-restart in ~3 seconds
- No downtime, no manual intervention
Suggestion
gateway restart should either:
- Use
launchctl kill instead of bootout/bootstrap cycle, or
- Ensure the
start phase reliably re-registers the plist before returning, with proper error reporting if it fails
Environment
KeepAlive=true,ThrottleInterval=1Steps to Reproduce
openclaw doctor)openclaw gateway restartExpected Behavior
Gateway stops and restarts within seconds, LaunchAgent plist remains registered.
Actual Behavior
launchctl bootout)openclaw doctor→ "Install gateway service? Yes"Log Evidence
Contrast:
launchctl kill SIGTERMworks correctlyUsing
launchctl kill SIGTERM gui/$(id -u)/ai.openclaw.gatewayinstead:KeepAlive=truetriggers launchd auto-restart in ~3 secondsSuggestion
gateway restartshould either:launchctl killinstead ofbootout/bootstrapcycle, orstartphase reliably re-registers the plist before returning, with proper error reporting if it fails