jdx/mise · error
timed out after {timeout:?}
Error message
timed out after {timeout:?} What it means
The command exceeded its configured timeout; the timeout guard killed the process tree, the process then exited unsuccessfully, and mise reports the timeout as the actual cause instead of the generic non-zero exit. It surfaces from execute_hashes_async_with_drain_timeout when hashing stdout/stderr of non-interactive probe commands.
Source
Thrown at src/cmd.rs:1460
bail!("command output pipes did not close within {pipe_drain_timeout:?}");
}
};
if let Err(err) = consume(output) {
#[cfg(unix)]
signal_process_tree(id, nix::sys::signal::Signal::SIGKILL);
#[cfg(windows)]
kill_process_tree(id);
return Err(err);
}
}
if let Some(guard) = &timeout_guard {
guard.cancel();
}
let status = status.expect("command wait must complete");
if !status.success() {
if let Some(timeout) = timeout_guard.as_ref().and_then(|guard| guard.timed_out()) {
bail!("timed out after {timeout:?}");
}
bail!("exited with non-zero status: {status}");
}
Ok((
stdout_hasher.finalize().to_hex().to_string(),
stderr_hasher.finalize().to_hex().to_string(),
))
}
/// Run the command and return stdout, even when raw mode is enabled.
pub(crate) async fn read(mut self) -> Result<String> {
let _read_lock = RAW_LOCK.read().await;
debug!("$ {self}");
self.cmd.kill_on_drop(true);
#[cfg(unix)]
if should_use_pgroup() {
self.cmd.env(TASK_PGID_MANAGED_ENV, "1");
unsafe {View on GitHub (pinned to afd2eddd3a)
Solutions
- Increase the configured timeout for this command (mise timeout setting / the Duration passed to the runner).
- Fix the underlying slowness: check network connectivity, proxies, or the tool being invoked (run it manually and time it).
- Remove hangs: ensure the command never blocks on stdin/password prompts — these probe commands run with stdin null.
- Cache or skip the command when its target (e.g. remote registry) is known to be unreachable.
Defensive patterns
Strategy: retry
Validate before calling
// Estimate the command's duration before running it under a tight timeout: time (cmd --version >/dev/null 2>&1) || echo "cmd too slow for current timeout"
Try / catch
match CmdLineRunner::new(cmd).with_timeout(d).execute_hashes().await {
Err(e) if e.to_string().contains("timed out after") => {
// back off and retry once with a larger timeout
retry_with_timeout(d * 4).await
}
other => other,
} Prevention
- Set timeouts generously above worst-case observed runtimes (CI is slower than laptops).
- Never let probe commands prompt for input; force non-interactive flags.
- Cache slow network lookups so repeated runs stay under the timeout.
- Monitor timeout frequency and adjust the configured Duration when infrastructure changes.
When it happens
Trigger: Raised at src/cmd.rs:1460 when `timeout_guard.timed_out()` is Some after the killed process returned a failed status, i.e. a CmdLineRunner with `.timeout(Some(d))` (via execute_hashes_async) whose command ran longer than `d`.
Common situations: Slow network probes (registry checks, version listings), tools hanging waiting on a dead socket, or a too-tight timeout configured in mise settings/task env on a machine with slow disk or network.
Understand the failure class
Background: Request timed out: what client-side request timeouts mean across libraries (Request timed out, TIMED_OUT, APITimeoutError) — this error's family across 39 libraries.
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
Related errors
- timed out after {duration:?}
- exited with non-zero status: {status}
- timed out after {timeout:?}
- {program} failed with {status}
- a process it started kept its output open
AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09).
Data as JSON: /api/errors/d96b367824fb410b.
Report an issue: GitHub.