diff --git a/src/logger.rs b/src/logger.rs index d6670a8..f66c3c1 100644 --- a/src/logger.rs +++ b/src/logger.rs @@ -1,6 +1,6 @@ use async_compression::tokio::write::{ZstdDecoder, ZstdEncoder}; use chrono::{DurationRound, TimeDelta, Utc}; -use eyre::{Result, format_err}; +use eyre::{format_err, Result}; use log::{debug, error, warn}; use std::path::{Path, PathBuf}; use std::process::Stdio; @@ -9,7 +9,8 @@ use tokio::{ io::{self, AsyncBufReadExt, AsyncRead, AsyncWrite, AsyncWriteExt, BufReader, BufWriter}, process, sync::mpsc, - time::{Duration, sleep}, + task::spawn_blocking, + time::{sleep, Duration}, }; use crate::{cgroup, fs}; @@ -92,7 +93,7 @@ impl<'t> Logger<'t> { // forward signals if let Some(child_pid) = child.id() { - std::thread::spawn(move || forward_signals_to(child_pid as i32)); + spawn_blocking(move || forward_signals_to(child_pid as i32)).await?; } // handle output @@ -200,24 +201,29 @@ impl<'t> Logger<'t> { fn forward_signals_to(pid: i32) { use nix::{ - sys::signal::{Signal, kill}, + sys::signal::{kill, Signal}, unistd::Pid, }; - use signal_hook::{consts::*, iterator::Signals}; + use signal_hook::{consts::*, low_level::register}; log::debug!("forwarding signals to pid {pid}"); - let mut signals = Signals::new([ - SIGHUP, SIGINT, SIGQUIT, SIGTERM, SIGUSR1, SIGUSR2, SIGPIPE, SIGALRM, - ]) - .expect("signal setup failed"); - let pid = Pid::from_raw(pid); - for signal in &mut signals { - let Ok(signal) = Signal::try_from(signal) else { + let signals = [ + SIGHUP, SIGINT, SIGQUIT, SIGTERM, SIGUSR1, SIGUSR2, SIGPIPE, SIGALRM, + ]; + + for sig in signals { + let Ok(signal) = Signal::try_from(sig) else { continue; }; - let _ = kill(pid, signal); + unsafe { + register(sig, move || { + log::debug!("forwarding {signal} to {pid}"); + let _ = kill(pid, signal); + }) + .ok(); + } } }