tower_server/
signal.rs

1//! Signal support.
2
3use tokio_util::sync::CancellationToken;
4
5/// Spawn a tokio signal listener that listens to `terminate` and `ctrl_c`.
6///
7/// Returns a [CancellationToken] that can be used with [crate::Builder].
8pub fn termination_signal() -> CancellationToken {
9    let cancel = CancellationToken::new();
10    tokio::spawn({
11        let cancel = cancel.clone();
12        async move {
13            let terminate = async {
14                tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate())
15                    .expect("failed to install signal handler")
16                    .recv()
17                    .await;
18            };
19            tokio::select! {
20                _ = tokio::signal::ctrl_c() => {
21                    cancel.cancel();
22                }
23                _ = terminate => {
24                    cancel.cancel();
25                }
26            }
27        }
28    });
29
30    cancel
31}