Shut down faster when receiving second SIGINT/SIGTERM

This commit is contained in:
Joscha 2023-08-06 14:10:16 +02:00
parent b8c3ce5d47
commit 5709a69694

View file

@ -5,13 +5,13 @@ mod somehow;
mod state; mod state;
mod web; mod web;
use std::{io, path::PathBuf}; use std::{io, path::PathBuf, process};
use clap::Parser; use clap::Parser;
use directories::ProjectDirs; use directories::ProjectDirs;
use state::AppState; use state::AppState;
use tokio::{select, signal::unix::SignalKind}; use tokio::{select, signal::unix::SignalKind};
use tracing::{debug, info, Level}; use tracing::{error, info, Level};
use tracing_subscriber::{ use tracing_subscriber::{
filter::Targets, prelude::__tracing_subscriber_SubscriberExt, util::SubscriberInitExt, filter::Targets, prelude::__tracing_subscriber_SubscriberExt, util::SubscriberInitExt,
}; };
@ -78,8 +78,6 @@ fn load_config(path: Option<PathBuf>) -> somehow::Result<&'static Config> {
} }
async fn wait_for_signal() -> io::Result<()> { async fn wait_for_signal() -> io::Result<()> {
debug!("Listening to signals");
let mut sigint = tokio::signal::unix::signal(SignalKind::interrupt())?; let mut sigint = tokio::signal::unix::signal(SignalKind::interrupt())?;
let mut sigterm = tokio::signal::unix::signal(SignalKind::terminate())?; let mut sigterm = tokio::signal::unix::signal(SignalKind::terminate())?;
@ -88,10 +86,23 @@ async fn wait_for_signal() -> io::Result<()> {
_ = sigterm.recv() => "SIGTERM", _ = sigterm.recv() => "SIGTERM",
}; };
info!("Received {signal}, shutting down"); info!("Received signal ({signal}), shutting down gracefully");
Ok(()) Ok(())
} }
async fn die_on_signal() -> io::Result<()> {
let mut sigint = tokio::signal::unix::signal(SignalKind::interrupt())?;
let mut sigterm = tokio::signal::unix::signal(SignalKind::terminate())?;
let signal = select! {
_ = sigint.recv() => "SIGINT",
_ = sigterm.recv() => "SIGTERM",
};
error!("Received second signal ({signal}), dying immediately");
process::exit(1);
}
async fn run() -> somehow::Result<()> { async fn run() -> somehow::Result<()> {
let args = Args::parse(); let args = Args::parse();
@ -103,12 +114,15 @@ async fn run() -> somehow::Result<()> {
info!("Startup complete, running"); info!("Startup complete, running");
select! { select! {
_ = wait_for_signal() => {}, _ = wait_for_signal() => {}
_ = web::run(state.clone()) => {}, _ = web::run(state.clone()) => {}
_ = recurring::run(state.clone()) => {}, _ = recurring::run(state.clone()) => {}
} }
state.shut_down().await; select! {
_ = die_on_signal() => {}
_ = state.shut_down() => {}
}
Ok(()) Ok(())
} }