now can run
This commit is contained in:
132
Cargo.lock
generated
132
Cargo.lock
generated
@@ -1,5 +1,11 @@
|
|||||||
# This file is automatically @generated by Cargo.
|
# This file is automatically @generated by Cargo.
|
||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
|
[[package]]
|
||||||
|
name = "arc-swap"
|
||||||
|
version = "0.4.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b585a98a234c46fc563103e9278c9391fde1f4e6850334da895d27edb9580f62"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "argparse"
|
name = "argparse"
|
||||||
version = "0.2.2"
|
version = "0.2.2"
|
||||||
@@ -104,6 +110,17 @@ version = "0.1.10"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
|
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "chrono"
|
||||||
|
version = "0.4.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2"
|
||||||
|
dependencies = [
|
||||||
|
"num-integer",
|
||||||
|
"num-traits",
|
||||||
|
"time",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "constant_time_eq"
|
name = "constant_time_eq"
|
||||||
version = "0.1.5"
|
version = "0.1.5"
|
||||||
@@ -371,6 +388,15 @@ dependencies = [
|
|||||||
"tokio-util",
|
"tokio-util",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hermit-abi"
|
||||||
|
version = "0.1.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "61565ff7aaace3525556587bd2dc31d4a07071957be715e63ce7b1eccf51a8f4"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hmac"
|
name = "hmac"
|
||||||
version = "0.7.1"
|
version = "0.7.1"
|
||||||
@@ -494,10 +520,12 @@ name = "keeprunningd"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"argparse",
|
"argparse",
|
||||||
|
"chrono",
|
||||||
"dingtalk",
|
"dingtalk",
|
||||||
"rust_util",
|
"rust_util",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -572,12 +600,35 @@ dependencies = [
|
|||||||
"kernel32-sys",
|
"kernel32-sys",
|
||||||
"libc",
|
"libc",
|
||||||
"log",
|
"log",
|
||||||
"miow",
|
"miow 0.2.1",
|
||||||
"net2",
|
"net2",
|
||||||
"slab",
|
"slab",
|
||||||
"winapi 0.2.8",
|
"winapi 0.2.8",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mio-named-pipes"
|
||||||
|
version = "0.1.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f5e374eff525ce1c5b7687c4cef63943e7686524a387933ad27ca7ec43779cb3"
|
||||||
|
dependencies = [
|
||||||
|
"log",
|
||||||
|
"mio",
|
||||||
|
"miow 0.3.3",
|
||||||
|
"winapi 0.3.8",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mio-uds"
|
||||||
|
version = "0.6.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0"
|
||||||
|
dependencies = [
|
||||||
|
"iovec",
|
||||||
|
"libc",
|
||||||
|
"mio",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "miow"
|
name = "miow"
|
||||||
version = "0.2.1"
|
version = "0.2.1"
|
||||||
@@ -590,6 +641,16 @@ dependencies = [
|
|||||||
"ws2_32-sys",
|
"ws2_32-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "miow"
|
||||||
|
version = "0.3.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "396aa0f2003d7df8395cb93e09871561ccc3e785f0acb369170e8cc74ddf9226"
|
||||||
|
dependencies = [
|
||||||
|
"socket2",
|
||||||
|
"winapi 0.3.8",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "native-tls"
|
name = "native-tls"
|
||||||
version = "0.2.4"
|
version = "0.2.4"
|
||||||
@@ -619,6 +680,35 @@ dependencies = [
|
|||||||
"winapi 0.3.8",
|
"winapi 0.3.8",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num-integer"
|
||||||
|
version = "0.1.42"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
|
"num-traits",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num-traits"
|
||||||
|
version = "0.2.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num_cpus"
|
||||||
|
version = "1.13.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
|
||||||
|
dependencies = [
|
||||||
|
"hermit-abi",
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "opaque-debug"
|
name = "opaque-debug"
|
||||||
version = "0.2.3"
|
version = "0.2.3"
|
||||||
@@ -958,6 +1048,16 @@ dependencies = [
|
|||||||
"opaque-debug",
|
"opaque-debug",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "signal-hook-registry"
|
||||||
|
version = "1.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41"
|
||||||
|
dependencies = [
|
||||||
|
"arc-swap",
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "slab"
|
name = "slab"
|
||||||
version = "0.4.2"
|
version = "0.4.2"
|
||||||
@@ -970,6 +1070,18 @@ version = "1.4.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4"
|
checksum = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "socket2"
|
||||||
|
version = "0.3.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "03088793f677dce356f3ccc2edb1b314ad191ab702a5de3faf49304f7e104918"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"libc",
|
||||||
|
"redox_syscall",
|
||||||
|
"winapi 0.3.8",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "subtle"
|
name = "subtle"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
@@ -1043,10 +1155,28 @@ dependencies = [
|
|||||||
"futures-core",
|
"futures-core",
|
||||||
"iovec",
|
"iovec",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
|
"libc",
|
||||||
"memchr",
|
"memchr",
|
||||||
"mio",
|
"mio",
|
||||||
|
"mio-named-pipes",
|
||||||
|
"mio-uds",
|
||||||
|
"num_cpus",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
|
"signal-hook-registry",
|
||||||
"slab",
|
"slab",
|
||||||
|
"tokio-macros",
|
||||||
|
"winapi 0.3.8",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tokio-macros"
|
||||||
|
version = "0.2.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|||||||
@@ -7,9 +7,11 @@ edition = "2018"
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
tokio = { version = "0.2.6", features = ["full"] }
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
argparse = "0.2.2"
|
argparse = "0.2.2"
|
||||||
rust_util = "0.2.4"
|
rust_util = "0.2.4"
|
||||||
dingtalk = "1.3.2"
|
dingtalk = "1.3.2"
|
||||||
|
chrono = "0.4.11"
|
||||||
|
# log = "0.4.8"
|
||||||
|
|||||||
10
keeprunningd.json
Normal file
10
keeprunningd.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"check_inverval_secs": 1,
|
||||||
|
"show_debug_output": true,
|
||||||
|
"notify_token": "------------",
|
||||||
|
"items": [{
|
||||||
|
"grep_tokens": ["java", "app"],
|
||||||
|
"title": "check java"
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
|
||||||
122
src/main.rs
122
src/main.rs
@@ -1,9 +1,23 @@
|
|||||||
use std::process::Command;
|
use std::{
|
||||||
|
fs,
|
||||||
|
panic,
|
||||||
|
thread,
|
||||||
|
time::Duration,
|
||||||
|
process::Command,
|
||||||
|
sync::Arc,
|
||||||
|
};
|
||||||
|
use chrono::prelude::*;
|
||||||
use serde::{ Deserialize, Serialize, };
|
use serde::{ Deserialize, Serialize, };
|
||||||
use rust_util::util_msg::{ print_info, print_error, };
|
use rust_util::{
|
||||||
|
util_file::locate_file,
|
||||||
|
util_msg::{ print_info, print_error, print_debug, }
|
||||||
|
};
|
||||||
|
use dingtalk::DingTalk;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
struct KeepRunningConfig {
|
struct KeepRunningConfig {
|
||||||
|
check_inverval_secs: Option<u64>,
|
||||||
|
show_debug_output: Option<bool>,
|
||||||
notify_token: String,
|
notify_token: String,
|
||||||
items: Vec<KeepRunningConfigItem>,
|
items: Vec<KeepRunningConfigItem>,
|
||||||
}
|
}
|
||||||
@@ -15,18 +29,91 @@ struct KeepRunningConfigItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
print_info("Start run: ps aux");
|
panic::set_hook(Box::new(|panic_info| {
|
||||||
let output_str = match ps_aux() {
|
print_error(&format!("Panic in running keeprunningd: {:?}", panic_info));
|
||||||
Some(output_str) => output_str, None => return,
|
}));
|
||||||
};
|
|
||||||
let lines = read_str_to_lines(&output_str);
|
|
||||||
|
|
||||||
// println!("{}", output_str);
|
let config_file_opt = locate_file(&[
|
||||||
// for ln in &lines {
|
"keeprunningd.json".into(),
|
||||||
// println!(">>>>>>> {}", ln);
|
"~/keeprunningd.json".into(),
|
||||||
// }
|
"/etc/keeprunningd.json".into()
|
||||||
println!("{:?}", lines.iter().filter(|ln| ln.contains("java") && ln.contains("aaa")).collect::<Vec<_>>());
|
]);
|
||||||
println!("{}", lines.len());
|
|
||||||
|
let config_file = match config_file_opt {
|
||||||
|
None => {
|
||||||
|
print_error("Cannot find config file!");
|
||||||
|
return;
|
||||||
|
},
|
||||||
|
Some(config_file) => {
|
||||||
|
print_info(&format!("Find config file: {:?}", &config_file));
|
||||||
|
config_file
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
let config_file_content = match fs::read_to_string(&config_file) {
|
||||||
|
Ok(c) => c, Err(err) => {
|
||||||
|
print_error(&format!("Read config file {:?}, error: {}", &config_file, err));
|
||||||
|
return;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
let keep_running_config: KeepRunningConfig = match serde_json::from_str(&config_file_content) {
|
||||||
|
Ok(c) => c, Err(err) => {
|
||||||
|
print_error(&format!("Parse config file: {:?}, error: {}", &config_file, err));
|
||||||
|
return;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
if keep_running_config.show_debug_output.unwrap_or(false) {
|
||||||
|
if let Ok(json) = serde_json::to_string_pretty(&keep_running_config) {
|
||||||
|
print_debug(&format!("Config: {}", json));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let keep_running_config: Arc<KeepRunningConfig> = Arc::new(keep_running_config);
|
||||||
|
for check_cnt in 0.. {
|
||||||
|
print_info(&format!("Check index: {} @{:?}", check_cnt, Local::now()));
|
||||||
|
keep_runningd(keep_running_config.clone());
|
||||||
|
thread::sleep(Duration::from_secs(keep_running_config.check_inverval_secs.unwrap_or(60 * 60)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn keep_runningd(keep_running_config: Arc<KeepRunningConfig>) {
|
||||||
|
let t = thread::spawn(move || {
|
||||||
|
let ps_aux_lines = read_str_to_lines(&match ps_aux() { Some(p) => p, None => return, });
|
||||||
|
for keep_running_config_item in &keep_running_config.items {
|
||||||
|
let check_lines = ps_aux_lines.iter().filter(|ln| {
|
||||||
|
keep_running_config_item.grep_tokens.iter().all(|t| ln.contains(t))
|
||||||
|
}).collect::<Vec<_>>();
|
||||||
|
if check_lines.is_empty() { // if check fail!
|
||||||
|
print_info("Send DingTalk notification!");
|
||||||
|
use tokio::runtime;
|
||||||
|
match runtime::Builder::new().basic_scheduler().enable_all().build() {
|
||||||
|
Err(err) => print_error(&format!("Prepare tokio runtime error: {}", err)),
|
||||||
|
Ok(mut rt) => {
|
||||||
|
let mut sb = String::with_capacity(1024);
|
||||||
|
sb.push_str(&format!("Check failed: {}", &keep_running_config_item.title));
|
||||||
|
sb.push_str(&format!("\ncheck time: {:?}", Local::now()));
|
||||||
|
rt.block_on(send_notify(&keep_running_config.notify_token, &sb));
|
||||||
|
},
|
||||||
|
}
|
||||||
|
} else if keep_running_config.show_debug_output.unwrap_or(false) {
|
||||||
|
print_debug(&format!("Find: {:?}", &check_lines));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if let Err(err) = t.join() {
|
||||||
|
print_error(&format!("Join check thread error: {:?}", err));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn send_notify(notify_token: &str, text: &str) {
|
||||||
|
match DingTalk::from_token(¬ify_token) {
|
||||||
|
Err(err) => print_error(&format!("Prepare DingTalk error: {}", err)),
|
||||||
|
Ok(dt) => if let Err(err) = dt.send_text(text).await {
|
||||||
|
print_error(&format!("Send DingTalk message error: {}", err));
|
||||||
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn ps_aux() -> Option<String> {
|
fn ps_aux() -> Option<String> {
|
||||||
@@ -39,16 +126,17 @@ fn ps_aux() -> Option<String> {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
match String::from_utf8(output.stdout) {
|
match String::from_utf8(output.stdout) {
|
||||||
Ok(output_str) => Some(output_str), Err(err) => {
|
Ok(output_str) => Some(output_str),
|
||||||
|
Err(err) => {
|
||||||
print_error(&format!("Get ps output as utf8 error: {}", err));
|
print_error(&format!("Get ps output as utf8 error: {}", err));
|
||||||
return None;
|
None
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Split string to lines, splited by '\r', '\n' or "\r\n"
|
||||||
fn read_str_to_lines(s: &str) -> Vec<String> {
|
fn read_str_to_lines(s: &str) -> Vec<String> {
|
||||||
let mut r = vec![];
|
let mut r = vec![];
|
||||||
|
|
||||||
let mut line = String::new();
|
let mut line = String::new();
|
||||||
let mut cs = s.chars();
|
let mut cs = s.chars();
|
||||||
while let Some(c) = cs.next() {
|
while let Some(c) = cs.next() {
|
||||||
@@ -64,6 +152,8 @@ fn read_str_to_lines(s: &str) -> Vec<String> {
|
|||||||
} else {
|
} else {
|
||||||
line.push(nc);
|
line.push(nc);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user