use tokio::signal;
use tracing::{info, warn};
pub async fn wait_for_shutdown_signal() {
#[cfg(unix)]
{
use tokio::signal::unix::{signal, SignalKind};
let mut sigterm = match signal(SignalKind::terminate()) {
Ok(s) => s,
Err(e) => {
warn!("Failed to register SIGTERM handler: {}", e);
signal::ctrl_c().await.ok();
return;
}
};
let mut sigint = match signal(SignalKind::interrupt()) {
Ok(s) => s,
Err(e) => {
warn!("Failed to register SIGINT handler: {}", e);
signal::ctrl_c().await.ok();
return;
}
};
tokio::select! {
_ = sigterm.recv() => {
info!("Received SIGTERM, shutting down gracefully...");
}
_ = sigint.recv() => {
info!("Received SIGINT, shutting down gracefully...");
}
_ = signal::ctrl_c() => {
info!("Received Ctrl+C, shutting down gracefully...");
}
}
}
#[cfg(not(unix))]
{
match signal::ctrl_c().await {
Ok(()) => {
info!("Received Ctrl+C, shutting down gracefully...");
}
Err(e) => {
warn!("Failed to listen for shutdown signal: {}", e);
}
}
}
}
pub async fn shutdown_signal() {
wait_for_shutdown_signal().await;
}
pub fn create_shutdown_receiver() -> tokio::sync::watch::Receiver<bool> {
let (tx, rx) = tokio::sync::watch::channel(false);
tokio::spawn(async move {
wait_for_shutdown_signal().await;
let _ = tx.send(true);
});
rx
}