diff --git a/rasp/librasp/src/jvm.rs b/rasp/librasp/src/jvm.rs index fd4d4a0be..e58ad047f 100644 --- a/rasp/librasp/src/jvm.rs +++ b/rasp/librasp/src/jvm.rs @@ -4,7 +4,6 @@ use log::*; use regex::Regex; use std::process::Command; use std::fs; -use std::thread; use std::time::Duration; use crate::async_command::run_async_process; use crate::process::ProcessInfo; diff --git a/rasp/librasp/src/manager.rs b/rasp/librasp/src/manager.rs index d7cb7ba3a..3e82b492c 100644 --- a/rasp/librasp/src/manager.rs +++ b/rasp/librasp/src/manager.rs @@ -2,12 +2,11 @@ use std::collections::HashMap; use std::ffi::OsStr; use std::fs; use std::path::Path; -use std::process::Command; use anyhow::{anyhow, Result, Result as AnyhowResult}; use crossbeam::channel::Sender; use fs_extra::dir::{copy, create_all, CopyOptions}; -use fs_extra::file::{copy as file_copy, remove as file_remove, CopyOptions as FileCopyOptions}; +use fs_extra::file::{copy as file_copy, CopyOptions as FileCopyOptions}; use libraspserver::proto::{PidMissingProbeConfig, ProbeConfigData}; use log::*; diff --git a/rasp/librasp/src/process.rs b/rasp/librasp/src/process.rs index ce2790ea8..604d482b2 100644 --- a/rasp/librasp/src/process.rs +++ b/rasp/librasp/src/process.rs @@ -319,6 +319,21 @@ impl ProcessInfo { } } +pub fn count_uptime(start_time: f32) -> AnyhowResult { + let ticks = procfs::ticks_per_second()? as f32; + let boottime = procfs::boot_time_secs()?; + let seconds_since_boot = ((start_time / ticks) as i64) as u64; + let timestamp = Clock::now_since_epoch().as_secs(); + let uptime = timestamp - seconds_since_boot - boottime; + if uptime <= 0 { + error!( + "uptime <=0: uptime: {} timestamp: {} seconds since boot: {} boot time: {}", + uptime, timestamp, seconds_since_boot, boottime + ); + } + return Ok(uptime); +} + fn traverse_proc(pid: i32) -> AnyhowResult> { let mut pids = Vec::new(); for entry in read_dir(format!("/proc/{}/root/proc", pid))? { diff --git a/rasp/librasp/src/runtime.rs b/rasp/librasp/src/runtime.rs index 9d142dc94..e5f8be20a 100644 --- a/rasp/librasp/src/runtime.rs +++ b/rasp/librasp/src/runtime.rs @@ -2,6 +2,7 @@ use std::collections::HashMap; use std::ffi::OsString; use std::fmt::{self, Display, Formatter}; use std::path::PathBuf; +use std::time::Duration; use anyhow::{anyhow, Result}; use log::*; @@ -12,7 +13,7 @@ use crate::golang::golang_bin_inspect; use crate::jvm::vm_version; use crate::nodejs::nodejs_version; use crate::php::{inspect_phpfpm, inspect_phpfpm_version, inspect_phpfpm_zts}; -use crate::process::ProcessInfo; +use crate::process::{ProcessInfo, count_uptime}; use serde::{Deserialize, Serialize}; const DEFAULT_JVM_FILTER_JSON_STR: &str = r#"{"exe": ["java"]}"#; @@ -72,6 +73,14 @@ pub trait RuntimeInspect { }; if jvm_process_filter_check_reuslt { + // https://bugs.openjdk.org/browse/JDK-8292695 + let uptime = count_uptime(process_info.start_time.unwrap()).unwrap_or(0); + if uptime > 0 && uptime < 5 { + let interval = 5 - uptime; + info!("JVM process {} just start, so sleep {} sec", process_info.pid, interval); + std::thread::sleep(Duration::from_secs(interval)); + } + let version = match vm_version(process_info.pid) { Ok(ver) => { if ver < 8 {