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

  1. Increase the configured timeout for this command (mise timeout setting / the Duration passed to the runner).
  2. Fix the underlying slowness: check network connectivity, proxies, or the tool being invoked (run it manually and time it).
  3. Remove hangs: ensure the command never blocks on stdin/password prompts — these probe commands run with stdin null.
  4. 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

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.

Related errors


AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09). Data as JSON: /api/errors/d96b367824fb410b. Report an issue: GitHub.