Shut down gently on SIGINT or SIGTERM (supposedly)
This commit is contained in:
parent
71c22daf0d
commit
9ef4fef858
|
@ -633,7 +633,7 @@ dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"mio 0.7.14",
|
"mio 0.7.14",
|
||||||
"parking_lot 0.11.2",
|
"parking_lot 0.11.2",
|
||||||
"signal-hook",
|
"signal-hook 0.1.17",
|
||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -3053,6 +3053,7 @@ dependencies = [
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_bare",
|
"serde_bare",
|
||||||
|
"signal-hook 0.3.13",
|
||||||
"sitemap",
|
"sitemap",
|
||||||
"smartstring",
|
"smartstring",
|
||||||
"tokio",
|
"tokio",
|
||||||
|
@ -3570,6 +3571,16 @@ dependencies = [
|
||||||
"signal-hook-registry",
|
"signal-hook-registry",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "signal-hook"
|
||||||
|
version = "0.3.13"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "647c97df271007dcea485bb74ffdb57f2e683f1306c854f468a0c244badabf2d"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"signal-hook-registry",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "signal-hook-registry"
|
name = "signal-hook-registry"
|
||||||
version = "1.4.0"
|
version = "1.4.0"
|
||||||
|
|
|
@ -51,6 +51,7 @@ lru = "0.7.3"
|
||||||
diplomatic-bag = "0.2.0"
|
diplomatic-bag = "0.2.0"
|
||||||
arc-interner = "0.7.0"
|
arc-interner = "0.7.0"
|
||||||
smartstring = "1.0.0"
|
smartstring = "1.0.0"
|
||||||
|
signal-hook = "0.3.13"
|
||||||
|
|
||||||
### Raking helpers
|
### Raking helpers
|
||||||
# HTTP Requests
|
# HTTP Requests
|
||||||
|
|
|
@ -9,12 +9,14 @@ use lru::LruCache;
|
||||||
use metrics_exporter_prometheus::PrometheusBuilder;
|
use metrics_exporter_prometheus::PrometheusBuilder;
|
||||||
use reqwest::header::{HeaderMap, HeaderValue, USER_AGENT};
|
use reqwest::header::{HeaderMap, HeaderValue, USER_AGENT};
|
||||||
use reqwest::redirect::Policy;
|
use reqwest::redirect::Policy;
|
||||||
|
use signal_hook::consts::{SIGINT, SIGTERM};
|
||||||
|
use signal_hook::iterator::Signals;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::sync::atomic::AtomicBool;
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use std::sync::{Arc, Mutex, RwLock};
|
use std::sync::{Arc, Mutex, RwLock};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use tokio::fs::File;
|
use tokio::fs::File;
|
||||||
use tokio::sync::{mpsc, oneshot, Semaphore};
|
use tokio::sync::{mpsc, oneshot, Notify, Semaphore};
|
||||||
use tokio::time::MissedTickBehavior;
|
use tokio::time::MissedTickBehavior;
|
||||||
|
|
||||||
use quickpeep_raker::config;
|
use quickpeep_raker::config;
|
||||||
|
@ -220,7 +222,13 @@ pub async fn main() -> anyhow::Result<()> {
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
drop(task_context);
|
let TaskContext {
|
||||||
|
graceful_stop,
|
||||||
|
notify,
|
||||||
|
..
|
||||||
|
} = task_context;
|
||||||
|
// ^C is SIGINT; systemd sends SIGTERM
|
||||||
|
start_signal_handler(Signals::new([SIGINT, SIGTERM])?, graceful_stop, notify)?;
|
||||||
|
|
||||||
for task in tasks {
|
for task in tasks {
|
||||||
task.await?;
|
task.await?;
|
||||||
|
@ -230,3 +238,22 @@ pub async fn main() -> anyhow::Result<()> {
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn start_signal_handler(
|
||||||
|
mut signals: Signals,
|
||||||
|
shutdown: Arc<AtomicBool>,
|
||||||
|
shutdown_notify: Arc<Notify>,
|
||||||
|
) -> anyhow::Result<()> {
|
||||||
|
std::thread::Builder::new()
|
||||||
|
.name("signals".to_string())
|
||||||
|
.stack_size(512)
|
||||||
|
.spawn(move || {
|
||||||
|
for sig in signals.forever() {
|
||||||
|
eprintln!("Received signal {:?}, shutting down.", sig);
|
||||||
|
shutdown.store(true, Ordering::SeqCst);
|
||||||
|
shutdown_notify.notify_waiters();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
})?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue