use tokio_util::sync::CancellationToken;
pub fn termination_signal() -> CancellationToken {
let cancel = CancellationToken::new();
tokio::spawn({
let cancel = cancel.clone();
async move {
let terminate = async {
tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate())
.expect("failed to install signal handler")
.recv()
.await;
};
tokio::select! {
_ = tokio::signal::ctrl_c() => {
cancel.cancel();
}
_ = terminate => {
cancel.cancel();
}
}
}
});
cancel
}