2个版本

0.1.1 2023年1月10日
0.1.0 2023年1月9日

#439操作系统

每月 23次下载

MIT/Apache

12KB
161

ragequit

Crates.io Docs.rs

优雅地关闭进程

ragequit 提供一组用于关闭进程的工具。它主要针对服务器进程,但也可能适用于其他应用。

用法

全局 SHUTDOWN 实例用于信号关闭事件,并通过创建 ShutdownListener 来优雅地处理它们。

use ragequit::{init, SHUTDOWN};

#[tokio::main]
async fn main() {
    // Install default system signal handlers.
    init();

    let listener = SHUTDOWN.listen();
    tokio::spawn(async move {
        // Wait for the shutdown signal.
        tokio::pin!(listener);
        (&mut listener).await;

        // Drop the listener, allowing the main process to exit.
        println!("Goodbye");
        drop(listener);
    });

    // Wait for a shutdown signal and for all listeners to be dropped.
    SHUTDOWN.wait().await;
}

在进程开始时调用 init 一次,以安装默认的系统信号处理程序。或者,您也可以自己安装系统信号处理程序。

Unix系统示例

use core::ffi::c_int;

use nix::sys::signal::{sigaction, SaFlags, SigAction, SigHandler, SigSet, Signal};
use ragequit::SHUTDOWN;

let action = SigAction::new(SigHandler::Handler(quit), SaFlags::empty(), SigSet::empty());

unsafe {
    let _ = sigaction(Signal::SIGINT, &action);
    let _ = sigaction(Signal::SIGTERM, &action);
}

extern "C" fn quit(_: c_int) {
    SHUTDOWN.quit();
}

Tokio依赖

ragequit 仅依赖于 tokio 的同步原语。它不依赖于 tokio 运行时。ragequit 可在任何异步运行时中工作。

许可

根据您的选择,许可协议为 MIT 许可证或 Apache 许可证版本 2.0。

依赖项

~3–15MB
~179K SLoC