shadowsocks_rust/monitor/
unix.rs

1use futures::future::{self, Either, FutureExt};
2use log::info;
3use std::io;
4use tokio::signal::unix::{SignalKind, signal};
5
6/// Create a monitor future for signals
7///
8/// It will exit when received `SIGTERM` or `SIGINT`.
9pub async fn create_signal_monitor() -> io::Result<()> {
10    // Future resolving to two signal streams. Can fail if setting up signal monitoring fails
11    let mut sigterm = signal(SignalKind::terminate())?;
12    let mut sigint = signal(SignalKind::interrupt())?;
13
14    let signal_name = match future::select(sigterm.recv().boxed(), sigint.recv().boxed()).await {
15        Either::Left(..) => "SIGTERM",
16        Either::Right(..) => "SIGINT",
17    };
18
19    info!("received {}, exiting", signal_name);
20
21    Ok(())
22}