>>105709433Sure :)
use signal_hook_registry::{register, unregister};
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use tokio::time::{sleep, Duration};
#[tokio::main]
async fn main() {
// Shared flag to indicate shutdown should happen
let running = Arc::new(AtomicBool::new(true));
let r = running.clone();
// Register handler for SIGINT (Ctrl+C)
let _handler_sigint = register(signal_hook_registry::SIGINT, move || {
println!("Received SIGINT. Shutting down...");
r.store(false, Ordering::SeqCst);
}).expect("Failed to register SIGINT handler");
// Register handler for SIGTERM
let _handler_sigterm = register(signal_hook_registry::SIGTERM, move || {
println!("Received SIGTERM. Shutting down...");
running.store(false, Ordering::SeqCst);
}).expect("Failed to register SIGTERM handler");
println!("Waiting for signals... (try Ctrl+C or sending SIGTERM)");
// Simulate work while checking the running flag
while running.load(Ordering::SeqCst) {
println!("Working...");
sleep(Duration::from_secs(1)).await;
}
println!("Goodbye!");
}