tauri-apps/tauri · warning

unable to kill native webdriver server

Error message

unable to kill native webdriver server

What it means

Shutdown-time panic in tauri-driver: on SIGTERM/SIGINT/SIGQUIT the signal task calls _driver.kill().expect("unable to kill native webdriver server") on the native WebDriver child process. kill() fails when the child has already exited (it crashed or was killed elsewhere, or a second signal raced the first), so the handler panics instead of exiting cleanly.

Source

Thrown at crates/tauri-driver/src/server.rs:186

#[tokio::main(flavor = "current_thread")]
pub async fn run(args: Args, mut _driver: Child) -> Result<(), Error> {
  #[cfg(unix)]
  let (signals_handle, signals_task) = {
    use futures_util::StreamExt;
    use signal_hook::consts::signal::*;

    let signals = signal_hook_tokio::Signals::new([SIGTERM, SIGINT, SIGQUIT])?;
    let signals_handle = signals.handle();
    let signals_task = tokio::spawn(async move {
      let mut signals = signals.fuse();
      #[allow(clippy::never_loop)]
      while let Some(signal) = signals.next().await {
        match signal {
          SIGTERM | SIGINT | SIGQUIT => {
            _driver
              .kill()
              .expect("unable to kill native webdriver server");
            std::process::exit(0);
          }
          _ => unreachable!(),
        }
      }
    });
    (signals_handle, signals_task)
  };

  let address = std::net::SocketAddr::from(([127, 0, 0, 1], args.port));

  // the client we use to proxy requests to the native webdriver
  let client = Client::builder(TokioExecutor::new())
    .http1_preserve_header_case(true)
    .http1_title_case_headers(true)
    .retry_canceled_requests(false)
    .build_http();

View on GitHub (pinned to 52e4b6e71d)

Solutions

  1. Upgrade tauri-driver — killing an already-exited child should be tolerated; check release notes for the fix
  2. Keep the native driver healthy during the run: watch its stderr and fix the underlying crash (often missing WebKitGTK libs)
  3. Send one termination signal and allow a grace period before escalating
  4. In CI wrappers, treat a non-zero tauri-driver exit during shutdown as non-fatal when the tests themselves already passed
Defensive patterns

Strategy: fallback

Prevention

When it happens

Trigger: Sending Ctrl+C/SIGTERM when the native WebDriver already died — e.g. it crashed during the test run — or a second termination signal arriving while the first shutdown is still in progress.

Common situations: Test session ends after WebKitWebDriver/msedgedriver crashed mid-run; CI sending SIGTERM then quickly SIGKILL; supervisors double-signaling tauri-driver.

Related errors


AI-assisted analysis of tauri-apps/tauri@52e4b6e71d (2026-08-20). Data as JSON: /api/errors/e45cd482e7ba4446. Report an issue: GitHub.