From f2acf36b774987ef9b245966a46f7056dfd6270b Mon Sep 17 00:00:00 2001 From: Niklas Elsbrock Date: Sun, 26 May 2024 12:47:28 +0200 Subject: [PATCH] exit on shutdown signal --- src/bin/disbahn.rs | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/bin/disbahn.rs b/src/bin/disbahn.rs index 7af5b4f..c2c5cd6 100644 --- a/src/bin/disbahn.rs +++ b/src/bin/disbahn.rs @@ -5,6 +5,7 @@ use log::error; use serenity::http::Http; use std::env; use std::time::Duration; +use tokio::io; fn env_var(name: &str) -> anyhow::Result { env::var(name).with_context(|| format!("Unable to fetch environment variable {name}")) @@ -51,10 +52,17 @@ async fn main() -> anyhow::Result<()> { loop { let now = chrono::Utc::now().timestamp(); let sleep_secs = (now / 300 + 1) * 300 - now; - tokio::time::sleep(Duration::from_secs( - sleep_secs.try_into().expect("sleep_secs is negative"), - )) - .await; + let shutdown = tokio::select! { + result = wait_for_shutdown_signal() => { + result.expect("error on waiting for shutdown signal"); true + }, + _ = tokio::time::sleep( + Duration::from_secs(sleep_secs.try_into().expect("sleep_secs is negative")) + ) => {false}, + }; + if shutdown { + break Ok(()); + } if let Err(err) = disbahn_client.refresh().await { error!("{}", err) } @@ -63,3 +71,25 @@ async fn main() -> anyhow::Result<()> { disbahn_client.refresh().await } } + +async fn wait_for_shutdown_signal() -> io::Result<()> { + let ctrl_c = tokio::signal::ctrl_c(); + + #[cfg(unix)] + { + use tokio::signal::unix; + + let sigterm = async { + unix::signal(unix::SignalKind::terminate())?.recv().await; + Ok(()) + }; + + tokio::select! { + result = ctrl_c => { result } + result = sigterm => { result } + } + } + + #[cfg(not(unix))] + ctrl_c.await +}