hashicorp/nomad · error
Error parsing max kill timeout: %s
Error message
Error parsing max kill timeout: %s
What it means
convertClientConfig parses client.max_kill_timeout with time.ParseDuration. If the string is not a valid Go duration literal, the parse error is formatted into 'Error parsing max kill timeout: %s' and client configuration fails. MaxKillTimeout caps how long Nomad waits before force-killing tasks, so it must be a valid duration.
Source
Thrown at command/agent/agent.go:988
if agentConfig.Client.CpuDisableDmidecode {
conf.CpuDisableDmidecode = agentConfig.Client.CpuDisableDmidecode
}
if agentConfig.Client.CpuCompute != 0 {
conf.CpuCompute = agentConfig.Client.CpuCompute
}
if agentConfig.Client.MemoryMB != 0 {
conf.MemoryMB = agentConfig.Client.MemoryMB
}
if agentConfig.Client.DiskTotalMB != 0 {
conf.DiskTotalMB = agentConfig.Client.DiskTotalMB
}
if agentConfig.Client.DiskFreeMB != 0 {
conf.DiskFreeMB = agentConfig.Client.DiskFreeMB
}
if agentConfig.Client.MaxKillTimeout != "" {
dur, err := time.ParseDuration(agentConfig.Client.MaxKillTimeout)
if err != nil {
return nil, fmt.Errorf("Error parsing max kill timeout: %s", err)
}
conf.MaxKillTimeout = dur
}
conf.ClientMaxPort = uint(agentConfig.Client.ClientMaxPort)
conf.ClientMinPort = uint(agentConfig.Client.ClientMinPort)
conf.MaxDynamicPort = agentConfig.Client.MaxDynamicPort
conf.MinDynamicPort = agentConfig.Client.MinDynamicPort
conf.DisableRemoteExec = agentConfig.Client.DisableRemoteExec
if agentConfig.Client.TemplateConfig != nil {
conf.TemplateConfig = conf.TemplateConfig.Merge(agentConfig.Client.TemplateConfig)
}
hvMap := make(map[string]*structs.ClientHostVolumeConfig, len(agentConfig.Client.HostVolumes))
for _, v := range agentConfig.Client.HostVolumes {
hvMap[v.Name] = v
}
conf.HostVolumes = hvMapView on GitHub (pinned to 482b49bf1a)
Solutions
- Use a valid Go duration string with a unit, e.g. max_kill_timeout = "30s" or "5m".
- Accepted units: ns, us, ms, s, m, h — fix the unit suffix.
- Remove the key to use Nomad's default max kill timeout.
Example fix
// before
client { max_kill_timeout = "30" }
// after
client { max_kill_timeout = "30s" } Defensive patterns
Strategy: validation
Validate before calling
if v := cfg.Client.MaxKillTimeout; v != "" {
if _, err := time.ParseDuration(v); err != nil {
return fmt.Errorf("max_kill_timeout %q is not a valid Go duration (e.g. 30s)", v)
}
} Prevention
- Always include unit suffixes: s, m, h (never bare numbers).
- Add duration-lint to config CI using time.ParseDuration.
- Copy duration syntax only from Go-based tools, not other ecosystems.
When it happens
Trigger: Setting client.max_kill_timeout to a malformed duration string (e.g. "30", "thirty seconds", "5min" instead of "5m") during agent startup or a reload via handleReload.
Common situations: Omitting the time unit ("30" instead of "30s"); using non-Go units like "min" or "hrs"; quotes stripped by templating leaving bare numbers; config copied from other tools with different duration syntax.
Understand the failure class
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
Related errors
- error parsing rpc_handshake_timeout: %v
- start_timeout should be greater than 0s
- start_block_for %v not a valid duration: %v
- plugin_exit_after %v not a valid duration: %v
- http_read_timeout not a valid duration: %w
AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04).
Data as JSON: /api/errors/394985143b52d833.
Report an issue: GitHub.