diff --git a/src/agent/rustjail/src/container.rs b/src/agent/rustjail/src/container.rs index 4cbfc5deb0..5284ebd185 100644 --- a/src/agent/rustjail/src/container.rs +++ b/src/agent/rustjail/src/container.rs @@ -818,30 +818,8 @@ impl BaseContainer for LinuxContainer { .map_err(|e| warn!(logger, "fcntl pfd log FD_CLOEXEC {:?}", e)); let child_logger = logger.new(o!("action" => "child process log")); - let log_handler = thread::spawn(move || { - let log_file = unsafe { std::fs::File::from_raw_fd(pfd_log) }; - let mut reader = BufReader::new(log_file); + let log_handler = setup_child_logger(pfd_log, child_logger)?; - loop { - let mut line = String::new(); - match reader.read_line(&mut line) { - Err(e) => { - info!(child_logger, "read child process log error: {:?}", e); - break; - } - Ok(count) => { - if count == 0 { - info!(child_logger, "read child process log end",); - break; - } - - info!(child_logger, "{}", line); - } - } - } - }); - - info!(logger, "exec fifo opened!"); let (prfd, cwfd) = unistd::pipe().context("failed to create pipe")?; let (crfd, pwfd) = unistd::pipe().context("failed to create pipe")?; @@ -1166,6 +1144,34 @@ fn get_namespaces(linux: &Linux) -> Vec { .collect() } +pub fn setup_child_logger(fd: RawFd, child_logger: Logger) -> Result> { + let builder = thread::Builder::new(); + builder + .spawn(move || { + let log_file = unsafe { std::fs::File::from_raw_fd(fd) }; + let mut reader = BufReader::new(log_file); + + loop { + let mut line = String::new(); + match reader.read_line(&mut line) { + Err(e) => { + info!(child_logger, "read child process log error: {:?}", e); + break; + } + Ok(count) => { + if count == 0 { + info!(child_logger, "read child process log end",); + break; + } + + info!(child_logger, "{}", line); + } + } + } + }) + .map_err(|e| anyhow!(e).context("failed to create thread")) +} + fn join_namespaces( logger: &Logger, spec: &Spec,