jdx/mise · error

error running : terminated by signal

Error message

error running {}: terminated by signal
{}

What it means

Same code path as the exit-code variant: the asdf plugin's `list-all` script was terminated by a signal rather than exiting normally (result.status.code() is None). mise reports the script name and its stderr.

Solutions

  1. Check dmesg/CI logs for OOM killer or timeout events and raise memory/time limits
  2. Re-run the command — signal kills are often transient
  3. Update the plugin, since some plugins spawn processes that get reaped incorrectly
  4. Switch to a native mise backend for the tool to avoid the plugin script entirely

Example fix

null
Defensive patterns

Strategy: retry

Validate before calling

null

Try / catch

catch (e) {
  if (/terminated by signal/.test(String(e))) {
    // transient kill (OOM/timeout): retry with backoff and more memory
  }
}

Prevention

When it happens

Trigger: The plugin's list-all script is killed by SIGKILL (OOM killer), SIGTERM (timeout manager), or similar while mise runs `mise ls-remote` or resolves a version for an asdf plugin.

Common situations: CI memory limits causing the OOM killer to terminate a memory-hungry plugin script; sandbox/timeout tooling sending SIGTERM; container killing long-running downloads in list-all.

Understand the failure class

Background: "git command failed": what it means when a tool shells out to git and git exits non-zero — this error's family across 21 libraries.

Related errors


AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/8f267db1f358040d. Report an issue: GitHub.

Appendix: source

Thrown at src/plugins/asdf_plugin.rs:133

            Settings::get().fetch_remote_versions_timeout(),
        )
        .wrap_err_with(|| {
            let script = script_man.get_script_path(&Script::ListAll);
            eyre!("Failed to run {}", display_path(script))
        })?;
        let stdout = String::from_utf8(result.stdout).unwrap();
        let stderr = String::from_utf8(result.stderr).unwrap().trim().to_string();

        let display_stderr = || {
            if !stderr.is_empty() {
                eprintln!("{stderr}");
            }
        };
        if !result.status.success() {
            let s = Script::ListAll;
            match result.status.code() {
                Some(code) => bail!("error running {}: exited with code {}\n{}", s, code, stderr),
                None => bail!("error running {}: terminated by signal\n{}", s, stderr),
            };
        } else if Settings::get().verbose {
            display_stderr();
        }

        Ok(stdout
            .split_whitespace()
            .map(|v| regex!(r"^v(\d+)").replace(v, "$1").to_string())
            .collect())
    }
    pub(crate) fn fetch_latest_stable(
        &self,
        script_man: &ScriptManager,
    ) -> eyre::Result<Option<String>> {
        let latest_stable = script_man.read(&Script::LatestStable)?.trim().to_string();
        Ok(if latest_stable.is_empty() {
            None
        } else {

View on GitHub (pinned to 533346cc37)