wavetermdev/waveterm · error

job manager exited without start signal

Error message

job manager exited without start signal

What it means

The readiness pipe reached EOF without ever containing 'Wave-JobManagerStart', meaning the jobmanager child process exited (closing its write end of fd 3) before signaling readiness. The child is killed and this error returned.

Source

Thrown at pkg/wshrpc/wshremote/wshremote_job.go:226

		}
	}()

	startCh := make(chan error, 1)
	go func() {
		scanner := bufio.NewScanner(readyPipeRead)
		for scanner.Scan() {
			line := scanner.Text()
			log.Printf("RemoteStartJobCommand: ready pipe line: %s\n", line)
			if strings.Contains(line, "Wave-JobManagerStart") {
				startCh <- nil
				return
			}
		}
		if err := scanner.Err(); err != nil {
			startCh <- fmt.Errorf("error reading ready pipe: %w", err)
		} else {
			log.Printf("RemoteStartJobCommand: ready pipe EOF\n")
			startCh <- fmt.Errorf("job manager exited without start signal")
		}
	}()

	timeoutCtx, cancel := context.WithTimeout(ctx, 5*time.Second)
	defer cancel()

	log.Printf("RemoteStartJobCommand: waiting for start signal\n")
	select {
	case err := <-startCh:
		if err != nil {
			cmd.Process.Kill()
			log.Printf("RemoteStartJobCommand: error from start signal: %v\n", err)
			return nil, err
		}
		log.Printf("RemoteStartJobCommand: received start signal\n")
	case <-timeoutCtx.Done():
		cmd.Process.Kill()
		log.Printf("RemoteStartJobCommand: timeout waiting for start signal\n")

View on GitHub (pinned to a4447c1563)

Solutions

  1. Inspect the stderr goroutine logs for the child's exit message
  2. Update the remote wsh binary with 'wsh init' so the jobmanager protocol matches the server
  3. Run the jobmanager command manually to reproduce its startup failure

Example fix

// before (remote binary too old, dies before signaling)
$ ssh remote 'wsh jobmanager --jobid x --clientid y'
Error: unknown command "jobmanager"
// after
$ wsh init   # installs a current wsh binary that supports jobmanager
Defensive patterns

Strategy: retry

Validate before calling

out, err := exec.Command(wshPath, "jobmanager", "--help").CombinedOutput()
if err != nil {
    return fmt.Errorf("remote wsh lacks jobmanager support: %v: %s", err, out)
}

Try / catch

rtn, err := server.RemoteStartJobCommand(ctx, data)
if err != nil {
    if strings.Contains(err.Error(), "exited without start signal") {
        // child died early: read captured stderr, fix binary/version, retry
    }
    return err
}

Prevention

When it happens

Trigger: The spawned 'wsh jobmanager' process terminates before sending its start signal — immediate crash, unknown flags, failed auth setup, or binary version mismatch.

Common situations: Outdated or mismatched wsh binary on the remote host; jobmanager panicking on startup; environment/config problems killing the child early.

Related errors


AI-assisted analysis of wavetermdev/waveterm@a4447c1563 (2026-09-01). Data as JSON: /api/errors/4d42bdf13af67485. Report an issue: GitHub.