From b055633cfd92ad07d103507d2c6a0c9763a66d3a Mon Sep 17 00:00:00 2001 From: "Hatter Jiang@Pixelbook" Date: Thu, 15 Oct 2020 08:13:23 +0800 Subject: [PATCH] feat: add file lock --- .gitignore | 1 + Cargo.lock | 124 ++++++++++++++++++++++++++++++++++++++++++++-- Cargo.toml | 1 + keeprunningd.json | 1 + src/main.rs | 30 ++++++++--- 5 files changed, 147 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 2f7896d..f77419d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ +.keeprunningd.lock target/ diff --git a/Cargo.lock b/Cargo.lock index 6bb7b3b..0ddf4b4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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" diff --git a/Cargo.toml b/Cargo.toml index b54eb35..8852e70 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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' diff --git a/keeprunningd.json b/keeprunningd.json index 04e8029..db77da2 100644 --- a/keeprunningd.json +++ b/keeprunningd.json @@ -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" diff --git a/src/main.rs b/src/main.rs index 7ed4658..c644d99 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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, show_debug_output: Option, notify_token: String, + lock_file: Option, items: Vec, } @@ -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 {