Skip to content

fix gateway restart outside systemd#72224

Open
myagizmaktav wants to merge 1 commit into
openclaw:mainfrom
myagizmaktav:fix/gateway-restart-non-systemd
Open

fix gateway restart outside systemd#72224
myagizmaktav wants to merge 1 commit into
openclaw:mainfrom
myagizmaktav:fix/gateway-restart-non-systemd

Conversation

@myagizmaktav

Copy link
Copy Markdown

Closes #72223

Summary

  • detect Linux background gateway listeners via native /proc inspection before falling back to lsof and ss
  • treat bare openclaw-gateway process titles as verified gateway processes for unmanaged restart signaling
  • reuse resolved gateway probe auth during unmanaged restart health checks so auth-protected gateways can report healthy after SIGUSR1 restarts

Testing

  • pnpm test src/cli/daemon-cli/lifecycle.test.ts src/cli/daemon-cli/restart-health.test.ts
  • pnpm test src/infra/gateway-process-argv.test.ts src/infra/gateway-processes.test.ts src/infra/restart-stale-pids.test.ts src/infra/restart.test.ts
  • pnpm build
  • verified locally in a non-systemd container: node openclaw.mjs gateway restart --json now returns result: "restarted" while the gateway is running in the background

@greptile-apps

greptile-apps Bot commented Apr 26, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR fixes gateway restart in non-systemd environments by adding native /proc-based socket inspection before falling back to lsof/ss, recognising bare openclaw-gateway process titles as valid gateway processes, and threading the resolved probe auth through the post-restart health checks so auth-protected gateways report healthy after SIGUSR1.

Confidence Score: 4/5

PR is safe to merge; both findings are non-blocking style issues with no impact on correctness.

No P0 or P1 issues found. Two P2 findings: dead code in the isGatewayArgv return expression, and a redundant double-read of config/auth on the unmanaged restart path. Core logic for /proc inspection, ss fallback, and auth threading looks correct and is well-tested.

src/infra/gateway-process-argv.ts (dead code on line 67), src/cli/daemon-cli/lifecycle.ts (duplicate config/auth resolution)

Prompt To Fix All With AI
This is a comment left during a code review.
Path: src/infra/gateway-process-argv.ts
Line: 67

Comment:
**Dead code: `|| isGatewayBinary` is always `false` here**

`isGatewayBinary` is computed at lines 43–45 and consumed by the early-return guard at lines 47–49. Any execution that reaches line 67 has already established that `isGatewayBinary === false`, making the trailing `|| isGatewayBinary` unreachable and misleading.

```suggestion
  return exe.endsWith("/openclaw") || exe === "openclaw";
```

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: src/cli/daemon-cli/lifecycle.ts
Line: 200-206

Comment:
**Duplicate config read and auth resolution on the unmanaged restart path**

When `restartGatewayWithoutServiceManager` is taken (lines 218–222), `assertUnmanagedGatewayRestartEnabled` (lines 82–109) already calls `readBestEffortConfig()` and `resolveDaemonProbeAuth` independently to build the pre-SIGUSR1 probe auth. This outer block then repeats the same two async calls to produce `restartProbeAuth` for the post-restart health check. Because the same config file is read twice and the same auth resolution module is loaded twice, any latency or transient error is doubled on the hot path.

Passing `restartProbeAuth` (or the resolved `cfg`) into `restartGatewayWithoutServiceManager``assertUnmanagedGatewayRestartEnabled` would let both steps share a single resolution.

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "fix gateway restart outside systemd" | Re-trigger Greptile

Comment thread src/infra/gateway-process-argv.ts Outdated
Comment thread src/cli/daemon-cli/lifecycle.ts Outdated
@myagizmaktav

Copy link
Copy Markdown
Author

Follow-up pushed for review comments: removed the dead branch in \ and collapsed unmanaged restart config/auth lookup to a single shared resolution path in . Re-ran targeted tests and \ ERR_PNPM_NO_IMPORTER_MANIFEST_FOUND  No package.json (or package.yaml, or package.json5) was found in "/config"..

@myagizmaktav

Copy link
Copy Markdown
Author

Follow-up pushed for review comments.

Changes:

  • removed the dead isGatewayBinary tail branch in src/infra/gateway-process-argv.ts
  • collapsed unmanaged restart config/auth lookup to a single shared resolution path in src/cli/daemon-cli/lifecycle.ts
  • added a regression test that asserts the unmanaged restart path only resolves config/probe auth once

Verification:

  • pnpm test src/cli/daemon-cli/lifecycle.test.ts src/cli/daemon-cli/restart-health.test.ts src/infra/gateway-process-argv.test.ts src/infra/gateway-processes.test.ts src/infra/restart-stale-pids.test.ts src/infra/restart.test.ts
  • pnpm build

@myagizmaktav

Copy link
Copy Markdown
Author

Addressed the review follow-ups in commit 684b027577.

Updated:

  • removed the dead isGatewayBinary tail branch in src/infra/gateway-process-argv.ts
  • collapsed unmanaged restart config/auth lookup to one shared resolution path in src/cli/daemon-cli/lifecycle.ts
  • added a regression test that asserts the unmanaged restart path only resolves config/probe auth once

Re-verified with:

  • pnpm test src/cli/daemon-cli/lifecycle.test.ts src/cli/daemon-cli/restart-health.test.ts src/infra/gateway-process-argv.test.ts src/infra/gateway-processes.test.ts src/infra/restart-stale-pids.test.ts src/infra/restart.test.ts
  • pnpm build

@clawsweeper

clawsweeper Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed July 3, 2026, 5:50 AM ET / 09:50 UTC.

Summary
The PR adds Linux /proc and ss listener discovery, accepts bare openclaw-gateway argv for verified signaling, and threads resolved probe auth into unmanaged restart health checks.

PR surface: Source +254, Tests +176. Total +430 across 10 files.

Reproducibility: yes. source-level: current main and v2026.6.11 still reject the reported bare openclaw-gateway argv shape. I did not run a live no-systemd/no-lsof container flow in this read-only review.

Review metrics: 1 noteworthy metric.

  • Listener discovery backends: 2 added: Linux /proc inode scan and ss fallback. Both new backends can produce signal targets, so maintainers need explicit proof that they preserve existing process-exclusion safety before merge.

Root-cause cluster
Relationship: canonical
Canonical: #72224
Summary: This PR remains the canonical open candidate for the shared non-systemd gateway listener discovery and bare openclaw-gateway argv gaps, but it is not merge-ready.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🧂 unranked krab
Proof: 🧂 unranked krab
Patch quality: 🧂 unranked krab
Result: blocked until real behavior proof is added.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • Rebase or recreate the branch on current main so the merge result is reviewable.
  • [P1] Fix protected-PID exclusions and the lifecycle mock type failure, then rerun focused gateway tests plus check-test-types.
  • Attach redacted current-head Linux no-systemd/no-lsof terminal output or logs proving unmanaged restart works.

Proof guidance:

  • [P1] Needs real behavior proof before merge: The PR body has a text claim of local container verification but no current-head terminal output, redacted logs, recording, or linked artifact showing the changed real behavior after the fix. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.

Risk before merge

  • [P1] GitHub reports the branch as conflicting/dirty, so a rebase or recreated branch is needed before the actual merge result is reviewable.
  • [P1] The new /proc and ss listener backends need to preserve current main's protected-PID exclusion or a live protected gateway process can be signaled during cleanup/restart.
  • [P1] check-test-types currently fails on the added lifecycle probe-auth mock type.
  • [P1] The external PR still has only a text claim of local container verification, not current-head redacted terminal output, logs, recording, or a linked artifact.

Maintainer options:

  1. Refresh and prove before merge (recommended)
    Rebase or recreate the branch on current main, thread protected-PID exclusions through /proc, ss, lsof, and Windows discovery, fix the type failure, then require redacted real Linux runtime proof.
  2. Carry a maintainer replacement
    If the contributor branch remains conflicting or proof cannot be supplied, maintainers can carry the useful argv, listener-discovery, and auth changes into a narrow replacement branch with source credit.
  3. Pause the source branch
    If nobody can refresh and prove the real non-systemd flow, keep the linked issues open and close or pause this PR as an unsafe landing candidate.

Next step before merge

  • [P1] Manual review and contributor action are needed because the external PR is conflicting and missing real behavior proof; automation cannot supply the contributor's runtime proof.

Security
Cleared: No dependency, workflow, secret, package-publishing, or supply-chain surface is changed; process-signaling safety is covered as a functional availability blocker.

Review findings

  • [P1] Preserve protected PID exclusions in new backends — src/infra/restart-stale-pids.ts:261
  • [P1] Widen the probe-auth test mock type — src/cli/daemon-cli/lifecycle.test.ts:56-57
Review details

Best possible solution:

Refresh the PR onto current main, preserve protected-PID exclusions in every listener backend, fix the probe-auth test mock types, and attach redacted Linux no-systemd/no-lsof runtime proof before merge.

Do we have a high-confidence way to reproduce the issue?

Yes, source-level: current main and v2026.6.11 still reject the reported bare openclaw-gateway argv shape. I did not run a live no-systemd/no-lsof container flow in this read-only review.

Is this the best way to solve the issue?

No, not in the current branch state: the fix direction is plausible, but the branch must be refreshed, preserve protected-PID safety, pass type checks, and include real behavior proof before it is the best fix to land.

Full review comments:

  • [P1] Preserve protected PID exclusions in new backends — src/infra/restart-stale-pids.ts:261
    Current main lets callers pass protectedPid into stale gateway cleanup so a reparented live gateway is not signaled. The new Linux /proc and ss discovery paths only exclude self/ancestors, so after refresh they can return that protected PID before the lsof path gets a chance to filter it.
    Confidence: 0.88
  • [P1] Widen the probe-auth test mock type — src/cli/daemon-cli/lifecycle.test.ts:56-57
    This hoisted mock is inferred as a no-arg mock that only returns { auth: undefined }, but the wrapper calls it with params and the added tests return token auth. The live check-test-types job fails on these lines, so give the mock an explicit parameter and return type that allows token/password auth.
    Confidence: 0.95

Overall correctness: patch is incorrect
Overall confidence: 0.9

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 36dd9ee3c3c1.

Label changes

Label justifications:

  • P2: The PR addresses a normal-priority gateway lifecycle reliability bug in non-systemd/container workflows with a manual workaround.
  • merge-risk: 🚨 compatibility: Gateway lifecycle fallback changes can alter existing stop/restart upgrade behavior and must preserve current cleanup exclusions.
  • merge-risk: 🚨 availability: The patch changes PID discovery and signaling for running gateway processes, which can stop or restart the wrong process if exclusions are lost.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🧂 unranked krab and patch quality is 🧂 unranked krab.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs real behavior proof before merge: The PR body has a text claim of local container verification but no current-head terminal output, redacted logs, recording, or linked artifact showing the changed real behavior after the fix. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
Evidence reviewed

PR surface:

Source +254, Tests +176. Total +430 across 10 files.

View PR surface stats
Area Files Added Removed Net
Source 4 282 28 +254
Tests 6 185 9 +176
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 10 467 37 +430

What I checked:

  • Repository policy read: Full root AGENTS.md was read; no scoped AGENTS.md exists under the touched src/cli or top-level src/infra paths, and the gateway compatibility/proof guidance applies. (AGENTS.md:1, 36dd9ee3c3c1)
  • Current main still lacks the argv fix: Current isGatewayArgv() returns false before the opt-in gateway-binary allowance when argv has no standalone gateway token, so ["openclaw-gateway"] is still rejected on main. (src/infra/gateway-process-argv.ts:13, 36dd9ee3c3c1)
  • Latest release still lacks the argv fix: v2026.6.11 has the same token guard before the opt-in gateway-binary branch, so the central fix is not shipped in the latest release. (src/infra/gateway-process-argv.ts:13, e085fa1a3ffd)
  • Current main protected-PID contract: Current main centralizes protected PID exclusion through getExcludedGatewayPidsSync, so reparented live gateway processes can be excluded from stale-process cleanup. (src/infra/restart-stale-pids.ts:190, 36dd9ee3c3c1)
  • PR head adds backends without protected-PID input: The new /proc and ss listener backends compute exclusions from self and ancestors only; after rebase they must take the same protected PID input as the lsof and Windows paths. (src/infra/restart-stale-pids.ts:261, f4e47b78d2a1)
  • Type-check failure: The live check-test-types job fails with TS2554 and TS2322 on the added lifecycle probe-auth mock and token-auth test returns. (src/cli/daemon-cli/lifecycle.test.ts:56, f4e47b78d2a1)

Likely related people:

  • vincentkoc: Commit bf9c362129e2 added unmanaged gateway stop/restart listener fallback, and 7c6ad2327c64 recently narrowed inherited gateway PID protection in the same restart area. (role: introduced unmanaged lifecycle behavior and recent area contributor; confidence: high; commits: bf9c362129e2, 7c6ad2327c64; files: src/cli/daemon-cli/lifecycle.ts, src/infra/restart-stale-pids.ts)
  • steipete: Commit 32a6eae576e5 created the shared gateway argv parser whose token ordering is central to the reported bare openclaw-gateway process shape. (role: shared argv verifier contributor; confidence: high; commits: 32a6eae576e5; files: src/infra/gateway-process-argv.ts)
  • amittell: Commit d88f1bf21703 added inherited gateway PID preservation across reparenting, which the PR's new listener backends need to preserve after rebase. (role: introduced protected-PID behavior; confidence: high; commits: d88f1bf21703; files: src/infra/restart-stale-pids.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

thebtf added a commit to thebtf/openclaw-unraid that referenced this pull request Apr 29, 2026
…/ re-bootstrap)

openclaw gateway restart relies on systemctl --user (src/daemon/systemd.ts:354) which is not present in the official ghcr.io/openclaw/openclaw:latest image. Until upstream openclaw/openclaw#72224 lands, document three working alternatives in the Troubleshooting section: SIGUSR1 to the live pid via docker exec for hot reload, docker restart for a clean cycle, full bootstrap re-run as last resort.
@mayank6136

Copy link
Copy Markdown

+1 from independent reproduction — flagging this PR also fixes #72948 (gateway stop foreground no-op), not just the restart side.

I retested #72948 against [email protected] in an isolated install yesterday and posted a root-cause writeup on the foreground-stop side. The src/infra/gateway-process-argv.ts change in this PR matches that analysis exactly — moving the allowGatewayBinary short-circuit ahead of the "gateway" token guard, accepting both openclaw-gateway and */openclaw-gateway. The new regression test (["openclaw-gateway"] with allowGatewayBinary: truetrue) is precisely the production argv shape Linux produces when the spawned child sets process.title.

Independent reproduction (same fix path, different symptom)

Setup on Ubuntu 24.04, no systemd / no service manager:

mkdir -p /tmp/openclaw-stop-test && cd /tmp/openclaw-stop-test
npm install [email protected]
export PATH="$PWD/node_modules/.bin:$PATH"

# Terminal A
openclaw gateway run --dev --port 38789

# Terminal B
ss -ltnp | grep 38789       # listener present
openclaw gateway stop        # prints "Gateway service disabled."
ss -ltnp | grep 38789       # still bound

Confirmed the verifier was the load-bearing piece via:

xxd /proc/$(pgrep -f openclaw-gateway | head -1)/cmdline
# 00000000: 6f70 656e 636c 6177 2d67 6174 6577 6179  openclaw-gateway
# 00000010: 0000 0000 0000 0000 0000 ...

process.title overwrites /proc/<pid>/cmdline to a single null-terminated entry, so parseProcCmdline returns ["openclaw-gateway"] — no "gateway" token, the early return at the token guard fires, and the opt-in allowGatewayBinary branch was unreachable. Your reordering fixes both the restart path (this PR's primary target, #72223) and the foreground stop path (#72948) in one change.

Two notes for whoever reviews

  1. Branch is currently mergeable_state: dirty — looks like main has moved a lot since 2026-04-26 (≈2,300 commits). A rebase would unblock CI / merge.
  2. Could the PR description add Closes #72948 (or Fixes #72948) alongside Closes #72223? It would let the foreground-stop bug auto-close on merge and give maintainers one less thing to manually thread.

Happy to retest end-to-end against the rebased branch (Linux + container, no systemd) once it's green and re-confirm both #72223 and #72948 reproduce-then-resolve. Just ping me here.

@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 12, 2026
@openclaw-barnacle openclaw-barnacle Bot added triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. labels May 12, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 12, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 12, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 13, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 13, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 13, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 13, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 13, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 13, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 15, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 15, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 15, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 15, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 15, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 15, 2026
@openclaw-barnacle openclaw-barnacle Bot added channel: whatsapp-web Channel integration: whatsapp-web channel: zalo Channel integration: zalo channel: zalouser Channel integration: zalouser app: android App: android app: ios App: ios app: macos App: macos gateway Gateway runtime extensions: copilot-proxy Extension: copilot-proxy extensions: diagnostics-otel Extension: diagnostics-otel security Security documentation docker Docker and sandbox tooling channel: feishu Channel integration: feishu channel: twitch Channel integration: twitch extensions: device-pair channel: irc extensions: acpx extensions: anthropic extensions: cloudflare-ai-gateway extensions: byteplus extensions: deepseek channel: qqbot channel: qa-channel Channel integration: qa-channel labels Jun 1, 2026
@myagizmaktav

Copy link
Copy Markdown
Author

Branch refreshed again.

Current state:

  • rebuilt PR branch cleanly from current main
  • force-updated PR to a single focused commit: f4e47b78d2
  • PR diff is now back to the intended 10 gateway lifecycle/process files only
  • dependency-graph/package-manifest drift is gone from the PR diff
  • branch is now 0 behind current main

Local verification on this clean branch:

  • node scripts/run-vitest.mjs src/cli/daemon-cli/lifecycle.test.ts src/cli/daemon-cli/restart-health.test.ts src/infra/gateway-process-argv.test.ts src/infra/gateway-processes.test.ts src/infra/restart-stale-pids.test.ts src/infra/restart.test.ts
  • pnpm build

I did not rerun a containerized no-systemd/no-lsof smoke in this environment, so that remains the only proof gap called out from the earlier review thread.

@clawsweeper

clawsweeper Bot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

@myagizmaktav thanks for the PR. ClawSweeper is still waiting on real behavior proof before this can move forward.

Useful proof can be a screenshot, short video, terminal output, copied live output, linked artifact, or redacted logs that show the changed behavior after the fix. Please redact private tokens, phone numbers, private endpoints, customer data, and anything else sensitive.

Once proof is added to the PR body or a comment, ClawSweeper or a maintainer can re-check it.

@clawsweeper

clawsweeper Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper status: review started.

I am starting a fresh review of this pull request: fix gateway restart outside systemd This is item 1/1 in the current shard. Shard 10/22.

This placeholder means the worker is alive and reading the current context. I will edit this same comment with the actual review when the claws are done clicking.

Crustacean status: shell secured, claws on keyboard, evidence pebbles being sorted.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cli CLI command changes merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P2 Normal backlog priority with limited blast radius. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. size: L status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. triage: needs-pr-context Candidate: external PR body lacks required problem context or evidence. triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

gateway restart should handle non-systemd background gateway processes

3 participants