1use tokio::signal::unix;
2
3pub const TERMINATION_SIGNALS: [libc::c_int; 5] = [
4 libc::SIGINT,
5 libc::SIGTERM,
6 libc::SIGQUIT,
7 libc::SIGABRT,
8 20, ];
10
11pub fn any_signal<I, T>(signals: I) -> tokio::sync::oneshot::Receiver<unix::SignalKind>
12where
13 I: IntoIterator<Item = T>,
14 T: Into<unix::SignalKind> + Send + 'static,
15{
16 let (tx, rx) = tokio::sync::oneshot::channel();
17
18 let any_signal = futures_util::future::select_all(signals.into_iter().map(|signal| {
19 Box::pin(async move {
20 let signal = signal.into();
21 unix::signal(signal)
22 .expect("Failed subscribing on unix signals")
23 .recv()
24 .await;
25 signal
26 })
27 }));
28
29 tokio::spawn(async move {
30 let signal = any_signal.await.0;
31 tx.send(signal).ok();
32 });
33
34 rx
35}