1use tokio_util::sync::CancellationToken;
4
5pub 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}