{"record":{"id":"b6fdb4f50dda7128","repo":"atuinsh/atuin","slug":"failed-to-listen-for-ctrl-c","errorCode":null,"errorMessage":"failed to listen for ctrl+c","messagePattern":"failed to listen for ctrl\\+c","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/atuin-daemon/src/lib.rs","lineNumber":135,"sourceCode":"#[cfg(unix)]\nasync fn shutdown_signal() {\n    let mut term = tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate())\n        .expect(\"failed to register sigterm handler\");\n    let mut int = tokio::signal::unix::signal(tokio::signal::unix::SignalKind::interrupt())\n        .expect(\"failed to register sigint handler\");\n\n    tokio::select! {\n        _ = term.recv() => {},\n        _ = int.recv() => {},\n    }\n}\n\n/// Wait for a shutdown signal (Ctrl+C).\n#[cfg(not(unix))]\nasync fn shutdown_signal() {\n    tokio::signal::ctrl_c()\n        .await\n        .expect(\"failed to listen for ctrl+c\");\n}\n","sourceCodeStart":117,"sourceCodeEnd":137,"githubUrl":"https://github.com/atuinsh/atuin/blob/202f6ad98ee0da165c35cdb2afbc5b13d6ab81a1/crates/atuin-daemon/src/lib.rs#L117-L137","documentation":"On non-Unix builds (Windows), atuin-daemon's shutdown_signal() awaits tokio::signal::ctrl_c(). This fails when the runtime has no IO driver enabled or the OS console-control registration (SetConsoleCtrlHandler) fails. The expect panics with 'failed to listen for ctrl+c' at daemon startup.","triggerScenarios":"Running the daemon on Windows inside a runtime built without enable_all()/enable_io(); the service account being unable to install a console control handler; restricted console environments.","commonSituations":"Windows service wrappers hosting atuin-daemon with a hand-built runtime; CI on Windows runners with constrained console access.","solutions":["Run the daemon through the shipped atuin binary, which constructs a fully enabled runtime","When embedding on Windows, build the runtime with .enable_all() before awaiting ctrl_c()","Verify the service account may register console control handlers"],"exampleFix":"// before\nlet rt = tokio::runtime::Builder::new_multi_thread().build()?;\n\n// after — ctrl_c() needs the IO driver\nlet rt = tokio::runtime::Builder::new_multi_thread()\n    .enable_all()\n    .build()?;","handlingStrategy":"validation","validationCode":"let rt = tokio::runtime::Builder::new_multi_thread()\n    .enable_all() // ctrl_c() needs the IO driver\n    .build()?;\nrt.block_on(async { /* daemon code incl. shutdown_signal() */ });","typeGuard":null,"tryCatchPattern":"if let Err(e) = tokio::signal::ctrl_c().await {\n    tracing::error!(\"ctrl+c listener unavailable: {e}; shutting down on completion instead\");\n}","preventionTips":["On Windows, ensure hosting runtimes are built with enable_all()","Verify the service account can register console control handlers","Prefer the shipped atuin binary's runtime setup over hand-built ones"],"tags":["rust","tokio","signals","windows","daemon","panic"],"backgroundTag":"tokio-signal-registration-failed","analyzedSha":"202f6ad98ee0da165c35cdb2afbc5b13d6ab81a1","analyzedAt":"2026-08-16T19:30:24.731Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}