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 = hvMap

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Use a valid Go duration string with a unit, e.g. max_kill_timeout = "30s" or "5m".
  2. Accepted units: ns, us, ms, s, m, h — fix the unit suffix.
  3. 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

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

Related errors


AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04). Data as JSON: /api/errors/394985143b52d833. Report an issue: GitHub.