chenhg5/cc-connect · error

restart: %s (%w)

Error message

restart: %s (%w)

What it means

Restart() wraps a failure of `systemctl restart cc-connect`, embedding systemctl's stdout. Restart implies both stop and start, so it fails if either half fails: unreachable systemd, invalid unit, or the service failing to come back up after stopping.

Source

Thrown at daemon/systemd.go:124

	out, err := runSystemctl(m.sysArgs("start", systemdServiceName)...)
	if err != nil {
		return fmt.Errorf("start: %s (%w)", out, err)
	}
	return nil
}

func (m *systemdManager) Stop() error {
	out, err := runSystemctl(m.sysArgs("stop", systemdServiceName)...)
	if err != nil {
		return fmt.Errorf("stop: %s (%w)", out, err)
	}
	return nil
}

func (m *systemdManager) Restart() error {
	out, err := runSystemctl(m.sysArgs("restart", systemdServiceName)...)
	if err != nil {
		return fmt.Errorf("restart: %s (%w)", out, err)
	}
	return nil
}

func (m *systemdManager) Status() (*Status, error) {
	st := &Status{Platform: m.Platform()}

	unitPath := m.unitPath()
	if _, err := os.Stat(unitPath); err != nil {
		return st, nil
	}
	st.Installed = true

	out, err := runSystemctl(m.sysArgs("show", systemdServiceName,
		"--no-page", "--property", "ActiveState,MainPID")...)
	if err != nil {
		return st, nil
	}

View on GitHub (pinned to 4000b2338a)

Solutions

  1. Read the embedded systemctl stdout to see the stop/start failure reason.
  2. Check unit validity: `systemd-analyze verify /etc/systemd/system/cc-connect.service`.
  3. Inspect post-restart logs: `journalctl -u cc-connect -e`.
  4. If restart-after-edit broke it, revert config.toml, reinstall, and restart.

Example fix

// before
mgr.Restart() // restart: Job for cc-connect.service failed because the control process exited with error code
// after
if err := mgr.Restart(); err != nil {
    out, _ := exec.Command("journalctl", "-u", "cc-connect", "-n", "20", "--no-pager").Output()
    return fmt.Errorf("restart failed: %w; logs: %s", err, out)
}
Defensive patterns

Strategy: try-catch

Validate before calling

if err := exec.Command("systemd-analyze", "verify", mgr.unitPath()).Run(); err != nil {
    return fmt.Errorf("unit invalid; fix config before restart: %w", err)
}
if err := exec.Command("systemctl", "is-system-running").Run(); err != nil {
    return fmt.Errorf("systemd not running: %w", err)
}

Type guard

func restartSafe(mgr *systemdManager) bool {
    return exec.Command("systemd-analyze", "verify", mgr.unitPath()).Run() == nil &&
        exec.Command("systemctl", "is-system-running").Run() == nil
}

Try / catch

if err := mgr.Restart(); err != nil {
    out, _ := exec.Command("journalctl", "-u", "cc-connect", "-n", "20", "--no-pager").Output()
    return fmt.Errorf("restart: %w\nrecent logs:\n%s", err, out)
}

Prevention

When it happens

Trigger: Calling Restart after a config change that produced a broken unit; systemd unreachable; the new process fails at startup (bad config value, port conflict, missing agent CLI).

Common situations: Editing config.toml with a typo then restarting the service; upgrading cc-connect to a binary path that no longer exists; WSL2 without systemd enabled.

Understand the failure class

Background: "git command failed": what it means when a tool shells out to git and git exits non-zero — this error's family across 21 libraries.

Related errors


AI-assisted analysis of chenhg5/cc-connect@4000b2338a (2026-09-06). Data as JSON: /api/errors/8dd4ca006f006f12. Report an issue: GitHub.