feat: add file lock

This commit is contained in:
2020-10-15 08:13:23 +08:00
parent 6c854065d9
commit b055633cfd
5 changed files with 147 additions and 10 deletions

1
.gitignore vendored
View File

@@ -1 +1,2 @@
.keeprunningd.lock
target/

124
Cargo.lock generated
View File

@@ -221,6 +221,18 @@ version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
[[package]]
name = "file-lock"
version = "1.1.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b16486239b3741480cef090b6f9924faf5dd5481022c6f266a51fab1a92971a2"
dependencies = [
"gcc",
"libc",
"mktemp",
"nix",
]
[[package]]
name = "fnv"
version = "1.0.6"
@@ -242,6 +254,12 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
[[package]]
name = "fuchsia-cprng"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
[[package]]
name = "fuchsia-zircon"
version = "0.3.3"
@@ -349,6 +367,12 @@ dependencies = [
"slab",
]
[[package]]
name = "gcc"
version = "0.3.55"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2"
[[package]]
name = "generic-array"
version = "0.12.3"
@@ -522,6 +546,7 @@ dependencies = [
"argparse",
"chrono",
"dingtalk",
"file-lock",
"lazy_static",
"log",
"rust_util",
@@ -654,6 +679,15 @@ dependencies = [
"winapi 0.3.8",
]
[[package]]
name = "mktemp"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77001ceb9eed65439f3dc2a2543f9ba1417d912686bf224a7738d0966e6dcd69"
dependencies = [
"uuid",
]
[[package]]
name = "native-tls"
version = "0.2.4"
@@ -683,6 +717,19 @@ dependencies = [
"winapi 0.3.8",
]
[[package]]
name = "nix"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "becb657d662f1cd2ef38c7ad480ec6b8cf9e96b27adb543e594f9cf0f2e6065c"
dependencies = [
"bitflags",
"cc",
"cfg-if",
"libc",
"void",
]
[[package]]
name = "num-integer"
version = "0.1.42"
@@ -831,6 +878,29 @@ dependencies = [
"proc-macro2",
]
[[package]]
name = "rand"
version = "0.3.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c"
dependencies = [
"libc",
"rand 0.4.6",
]
[[package]]
name = "rand"
version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
dependencies = [
"fuchsia-cprng",
"libc",
"rand_core 0.3.1",
"rdrand",
"winapi 0.3.8",
]
[[package]]
name = "rand"
version = "0.7.3"
@@ -840,7 +910,7 @@ dependencies = [
"getrandom",
"libc",
"rand_chacha",
"rand_core",
"rand_core 0.5.1",
"rand_hc",
]
@@ -851,9 +921,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
dependencies = [
"ppv-lite86",
"rand_core",
"rand_core 0.5.1",
]
[[package]]
name = "rand_core"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
dependencies = [
"rand_core 0.4.2",
]
[[package]]
name = "rand_core"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
[[package]]
name = "rand_core"
version = "0.5.1"
@@ -869,7 +954,16 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
dependencies = [
"rand_core",
"rand_core 0.5.1",
]
[[package]]
name = "rdrand"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
dependencies = [
"rand_core 0.3.1",
]
[[package]]
@@ -957,6 +1051,12 @@ dependencies = [
"term_size",
]
[[package]]
name = "rustc-serialize"
version = "0.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda"
[[package]]
name = "ryu"
version = "1.0.4"
@@ -1121,7 +1221,7 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9"
dependencies = [
"cfg-if",
"libc",
"rand",
"rand 0.7.3",
"redox_syscall",
"remove_dir_all",
"winapi 0.3.8",
@@ -1296,6 +1396,16 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3df3561629a8bb4c57e5a2e4c43348d9e29c7c29d9b1c4c1f47166deca8f37ed"
[[package]]
name = "uuid"
version = "0.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78c590b5bd79ed10aad8fb75f078a59d8db445af6c743e55c4a53227fc01c13f"
dependencies = [
"rand 0.3.23",
"rustc-serialize",
]
[[package]]
name = "vcpkg"
version = "0.2.8"
@@ -1308,6 +1418,12 @@ version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce"
[[package]]
name = "void"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
[[package]]
name = "want"
version = "0.3.0"

View File

@@ -17,6 +17,7 @@ chrono = "0.4"
lazy_static = "1.4"
log = "0.4"
simple-logging = "2.0"
file-lock = "1.1"
[profile.release]
opt-level = 'z'

View File

@@ -2,6 +2,7 @@
"check_inverval_secs": 1,
"show_debug_output": true,
"notify_token": "------------",
"lock_file": ".keeprunningd.lock",
"items": [{
"grep_tokens": ["java", "app"],
"title": "check java"

View File

@@ -5,6 +5,7 @@ use std::{ collections::HashMap, fs, panic, thread, time::Duration, process::Com
use log::LevelFilter;
use chrono::prelude::*;
use serde::{ Deserialize, Serialize };
use file_lock::FileLock;
use rust_util::{ util_str::read_str_to_lines, util_file::locate_file };
use dingtalk::DingTalk;
@@ -13,6 +14,7 @@ struct KeepRunningConfig {
check_inverval_secs: Option<u64>,
show_debug_output: Option<bool>,
notify_token: String,
lock_file: Option<String>,
items: Vec<KeepRunningConfigItem>,
}
@@ -28,12 +30,6 @@ lazy_static!{
}
fn main() {
if let Err(_) = simple_logging::log_to_file("/var/log/keeprunningd.log", LevelFilter::Info) {
if let Err(_) = simple_logging::log_to_file("/tmp/keeprunningd.log", LevelFilter::Info) {
simple_logging::log_to_stderr(LevelFilter::Info);
}
}
panic::set_hook(Box::new(|panic_info| {
error!("Panic in running keeprunningd: {:?}", panic_info);
}));
@@ -41,12 +37,34 @@ fn main() {
Some(c) => c, None => return,
};
let mut the_file_lock = None;
if let Some(ref lock_file) = keep_running_config.lock_file {
the_file_lock = match FileLock::lock(lock_file, false, true) {
Ok(lock) => {
info!("Lock file success: {}", lock_file);
Some(lock)
},
Err(_) => {
warn!("Lock file failed: {}", lock_file);
return;
},
};
}
if let Err(_) = simple_logging::log_to_file("/var/log/keeprunningd.log", LevelFilter::Info) {
if let Err(_) = simple_logging::log_to_file("/tmp/keeprunningd.log", LevelFilter::Info) {
simple_logging::log_to_stderr(LevelFilter::Info);
}
}
let keep_running_config = Arc::new(keep_running_config);
for check_cnt in 0.. {
info!("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)));
}
drop(the_file_lock);
}
fn parse_keep_running_config() -> Option<KeepRunningConfig> {