1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use tokio::signal;

/// copy from axum/examples/graceful-shutdown/src/main.rs
/// receive Ctrl + C and graceful shutdown server
/// # graceful shutdown Example
/// ```rust,no_run
/// use axum::{Router, routing::get};
/// use axum_restful::utils::shutdown_signal;
///
/// // let app = Router::new().route("/", get(|| async {"hello"}));
/// # async {
/// //axum::Server::bind(&"".parse().unwrap())
///  //    .serve(app.into_make_service())
///  //    .with_graceful_shutdown(shutdown_signal())
///  //    .await
///  //    .unwrap()
/// # };
/// ```
pub async fn shutdown_signal() {
    let ctrl_c = async {
        signal::ctrl_c()
            .await
            .expect("failed to install Ctrl+C handler");
    };

    #[cfg(unix)]
    let terminate = async {
        signal::unix::signal(signal::unix::SignalKind::terminate())
            .expect("failed to install signal handler")
            .recv()
            .await;
    };

    #[cfg(not(unix))]
    let terminate = std::future::pending::<()>();

    tokio::select! {
        _ = ctrl_c => {},
        _ = terminate => {},
    }

    println!("signal received, starting graceful shutdown");
}