use tokio_util::sync::CancellationToken;
pub fn install_signal_handlers(shutdown: CancellationToken) {
#[cfg(unix)]
{
use tokio::signal::unix::{signal, SignalKind};
tokio::spawn(async move {
let mut term = match signal(SignalKind::terminate()) {
Ok(s) => s,
Err(e) => {
tracing::warn!("failed to install SIGTERM handler: {e}");
return;
}
};
let mut interrupt = match signal(SignalKind::interrupt()) {
Ok(s) => s,
Err(e) => {
tracing::warn!("failed to install SIGINT handler: {e}");
return;
}
};
let mut hangup = match signal(SignalKind::hangup()) {
Ok(s) => s,
Err(e) => {
tracing::warn!("failed to install SIGHUP handler: {e}");
return;
}
};
tokio::select! {
_ = term.recv() => tracing::info!("received SIGTERM; shutting down"),
_ = interrupt.recv() => tracing::info!("received SIGINT; shutting down"),
_ = hangup.recv() => tracing::info!("received SIGHUP; shutting down"),
}
shutdown.cancel();
});
}
#[cfg(not(unix))]
{
tokio::spawn(async move {
if tokio::signal::ctrl_c().await.is_ok() {
tracing::info!("received Ctrl-C; shutting down");
shutdown.cancel();
}
});
}
}