diff --git a/res/lazymc.toml b/res/lazymc.toml index cf781df..20f5b33 100644 --- a/res/lazymc.toml +++ b/res/lazymc.toml @@ -36,6 +36,9 @@ command = "java -Xmx1G -Xms1G -jar server.jar --nogui" # Immediately wake server when starting lazymc. #wake_on_start = false +# Immediately wake server after crash. +#wake_on_crash = false + [time] # Sleep after number of seconds. #sleep_after = 60 diff --git a/src/config.rs b/src/config.rs index d008b48..16d73f7 100644 --- a/src/config.rs +++ b/src/config.rs @@ -132,6 +132,10 @@ pub struct Server { /// Immediately wake server when starting lazymc. #[serde(default)] pub wake_on_start: bool, + + /// Immediately wake server after crash. + #[serde(default)] + pub wake_on_crash: bool, } /// Time configuration. diff --git a/src/monitor.rs b/src/monitor.rs index 5a6d07c..6078ced 100644 --- a/src/monitor.rs +++ b/src/monitor.rs @@ -62,7 +62,7 @@ pub async fn monitor_server(config: Arc, server: Arc) { // Check whether we should force kill server if server.should_kill() { - error!(target: "lazymc::montior", "Force killing server, took too long to start/stop"); + error!(target: "lazymc::montior", "Force killing server, took too long to start or stop"); if !server.force_kill().await { warn!(target: "lazymc", "Failed to force kill server"); } diff --git a/src/os/mod.rs b/src/os/mod.rs index fd51a0b..614a646 100644 --- a/src/os/mod.rs +++ b/src/os/mod.rs @@ -28,7 +28,7 @@ pub fn force_kill(pid: u32) -> bool { /// # Panics /// /// Panics on platforms other than Unix. -#[allow(unreachable_code)] +#[allow(unreachable_code, dead_code, unused_variables)] pub fn kill_gracefully(pid: u32) -> bool { #[cfg(unix)] unsafe { diff --git a/src/server.rs b/src/server.rs index 3a83d1f..4dfa027 100644 --- a/src/server.rs +++ b/src/server.rs @@ -348,23 +348,32 @@ pub async fn invoke_server_cmd( .replace(child.id().expect("unknown server PID")); // Wait for process to exit, handle status - match child.wait().await { + let crashed = match child.wait().await { Ok(status) if status.success() => { debug!(target: "lazymc", "Server process stopped successfully ({})", status); + false } Ok(status) => { warn!(target: "lazymc", "Server process stopped with error code ({})", status); + state.state() == State::Started } Err(err) => { error!(target: "lazymc", "Failed to wait for server process to quit: {}", err); error!(target: "lazymc", "Assuming server quit, cleaning up..."); + false } - } + }; // Set state to stopped, update server PID state.pid.lock().unwrap().take(); state.update_state(State::Stopped, &config); + // Restart on crash + if crashed && config.server.wake_on_crash { + warn!(target: "lazymc", "Server crashed, restarting..."); + Server::start(config, state, None); + } + Ok(()) }