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
- Inspect the stderr goroutine logs for the child's exit message
- Update the remote wsh binary with 'wsh init' so the jobmanager protocol matches the server
- 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
- Update the remote wsh binary after every server upgrade
- Always inspect the stderr goroutine logs when this error appears
- Smoke-test 'wsh jobmanager' on the remote before production use
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
- procinfo: process not found
- error starting controller: %w
- failed to start durable shell: %w
- failed to run tsunami app: %w
- failed to create stdout pipe: %w
AI-assisted analysis of wavetermdev/waveterm@a4447c1563 (2026-09-01).
Data as JSON: /api/errors/4d42bdf13af67485.
Report an issue: GitHub.