add graceful shutdown on SIGTERM for *nix
This commit is contained in:
+33
-2
@@ -1,7 +1,10 @@
|
|||||||
use log::{debug, error, LevelFilter};
|
use log::{debug, error, LevelFilter};
|
||||||
use serenity::prelude::*;
|
use serenity::prelude::*;
|
||||||
use spamcontest::Handler;
|
use spamcontest::Handler;
|
||||||
use std::{env, process};
|
use std::{env, io, process};
|
||||||
|
|
||||||
|
#[cfg(unix)]
|
||||||
|
use tokio::pin;
|
||||||
|
|
||||||
const TOKEN_VAR_KEY: &str = "DISCORD_TOKEN";
|
const TOKEN_VAR_KEY: &str = "DISCORD_TOKEN";
|
||||||
|
|
||||||
@@ -34,7 +37,10 @@ async fn main() {
|
|||||||
|
|
||||||
let shard_manager = client.shard_manager.clone();
|
let shard_manager = client.shard_manager.clone();
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
tokio::signal::ctrl_c().await.expect("ctrl+c handler error");
|
wait_for_shutdown_signal()
|
||||||
|
.await
|
||||||
|
.expect("error on waiting for shutdown signal");
|
||||||
|
|
||||||
debug!("Shutting down...");
|
debug!("Shutting down...");
|
||||||
shard_manager.lock().await.shutdown_all().await;
|
shard_manager.lock().await.shutdown_all().await;
|
||||||
});
|
});
|
||||||
@@ -44,3 +50,28 @@ async fn main() {
|
|||||||
process::exit(2);
|
process::exit(2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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(())
|
||||||
|
};
|
||||||
|
|
||||||
|
pin!(ctrl_c);
|
||||||
|
pin!(sigterm);
|
||||||
|
|
||||||
|
tokio::select! {
|
||||||
|
result = &mut ctrl_c => { result }
|
||||||
|
result = &mut sigterm => { result }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(unix))]
|
||||||
|
ctrl_c.await
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user