Compare commits

..

No commits in common. "main" and "1.0.2" have entirely different histories.
main ... 1.0.2

6 changed files with 42 additions and 83 deletions

View File

@ -1,12 +1,9 @@
name: Releasing name: Releasing
run-name: ${{ github.actor }} is building the files for a release 🚀 run-name: ${{ github.actor }} is building a release releasing 🚀
on: on: [release]
release:
types: [created]
jobs: jobs:
release: release:
name: release ${{ matrix.target }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
fail-fast: false fail-fast: false
@ -21,9 +18,16 @@ jobs:
steps: steps:
- uses: actions/checkout@master - uses: actions/checkout@master
- name: Compile and release - name: Compile and release
id: compile
uses: rust-build/rust-build.action@v1.4.4 uses: rust-build/rust-build.action@v1.4.4
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with: with:
RUSTTARGET: ${{ matrix.target }} RUSTTARGET: ${{ matrix.target }}
ARCHIVE_TYPES: ${{ matrix.archive }} ARCHIVE_TYPES: ${{ matrix.archive }}
UPLOAD_MODE: 'none'
- name: Upload artifact
uses: actions/upload-artifact@v3
with:
name: Binary
path: ${{ steps.compile.outputs.BUILT_ARCHIVE }}

2
Cargo.lock generated
View File

@ -123,7 +123,7 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
[[package]] [[package]]
name = "kr" name = "kr"
version = "1.0.3" version = "1.0.2"
dependencies = [ dependencies = [
"clap", "clap",
] ]

View File

@ -1,6 +1,6 @@
[package] [package]
name = "kr" name = "kr"
version = "1.0.3" version = "1.0.2"
edition = "2021" edition = "2021"
# 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

View File

@ -1,35 +0,0 @@
Keep Running
---
Keep running is a quick and easy way to **keep** a process **running** during development or other **non-production** tasks.
> Please for the love of sanity, do not use this is production...
# Usage
Below you will see the output of the `--help` command.
Do note that if you don't specify any `--per-*` flag, it defaults to `--per-minute=4`.
```
Usage: kr [OPTIONS] <COMMAND>
Arguments:
<COMMAND>
Options:
--per-minute <PER_MINUTE> [default: 0]
--per-hour <PER_HOUR> [default: 0]
--delay <DELAY> [default: 0]
-h, --help Print help
-V, --version Print version
```
# Use cases
## Game servers
/keep-running/ is a great tool to run, for example, a Modded minecraft server.
As it automatically restarts the server if a crash occurs.
![img.png](assets/vault-hunters-3rd.png)

View File

@ -17,7 +17,7 @@ struct Arguments {
delay: u8, delay: u8,
#[arg()] #[arg()]
command: String, command: String
} }
const SECONDS_IN_A_MINUTE: u16 = 60; const SECONDS_IN_A_MINUTE: u16 = 60;
@ -29,36 +29,30 @@ struct Retry {
max_retries: u8, max_retries: u8,
timespan: u16, timespan: u16,
restart_delay: u8, restart_delay: u8,
restart_name: String, restart_name: String
} }
fn main() { fn main() {
let arguments = Arguments::parse(); let arguments = Arguments::parse();
let mut max_retries = 4; let mut retry: Retry = Retry {
let mut timespan = SECONDS_IN_A_MINUTE; command: arguments.command,
let mut restart_name = String::from("minute");
let Arguments { per_minute, per_hour, .. } = arguments;
if per_minute > 0 {
max_retries = per_minute;
} else if per_hour > 0 {
max_retries = per_hour;
timespan = SECONDS_IN_A_HOUR;
restart_name = String::from("hour");
}
let Arguments { command, delay: restart_delay, .. } = arguments;
let retry: Retry = Retry {
max_retries,
timespan,
restart_name,
command,
restart_delay,
history: Vec::new(), history: Vec::new(),
max_retries: 4,
timespan: SECONDS_IN_A_MINUTE,
restart_delay: arguments.delay,
restart_name: "minute".to_string(),
}; };
run_command(retry) if arguments.per_minute > 0 {
retry.max_retries = arguments.per_minute;
} else if arguments.per_hour > 0 {
retry.max_retries = arguments.per_hour;
retry.timespan = SECONDS_IN_A_HOUR;
retry.restart_name = "hour".to_string();
}
run_command(&mut retry)
} }
fn get_now() -> u64 { fn get_now() -> u64 {
@ -68,29 +62,26 @@ fn get_now() -> u64 {
.as_secs(); .as_secs();
} }
fn push_history(mut history: Vec<u64>, timespan: u16) -> Vec<u64> { fn push_history(retry: &mut Retry) {
history.push(get_now() + u64::from(timespan)); retry.history.push(get_now() + u64::from(retry.timespan));
return history.to_owned()
} }
fn update_history(mut history: Vec<u64>) -> Vec<u64> { fn update_history(retry: &mut Retry) {
let now = get_now(); let now = get_now();
let clear_times: Vec<u64> = history let clear_times: Vec<u64> = retry
.history
.iter() .iter()
.filter(|&time| time <= &now) .filter(|&time| time <= &now)
.map(|&time| time) .map(|&time| time)
.collect(); .collect();
for time in clear_times { for time in clear_times {
history.retain(|&h| h != time); retry.history.retain(|&h| h != time);
} }
return history.to_owned();
} }
fn check_history(history: &Vec<u64>, max_retries: u8) -> bool { fn check_history(retry: &Retry) -> bool {
return history.len().lt(&usize::from(max_retries)) return retry.history.len().lt(&usize::from(retry.max_retries))
} }
fn spawn_process(retry: &Retry) -> Result<Child, std::io::Error> { fn spawn_process(retry: &Retry) -> Result<Child, std::io::Error> {
@ -110,8 +101,8 @@ fn spawn_process(retry: &Retry) -> Result<Child, std::io::Error> {
} }
} }
fn run_command(mut retry: Retry) { fn run_command(retry: &mut Retry) {
let mut process = spawn_process(&retry) let mut process = spawn_process(retry)
.expect("Process failed on startup"); .expect("Process failed on startup");
let exit_code = match process.wait() { let exit_code = match process.wait() {
@ -126,10 +117,9 @@ fn run_command(mut retry: Retry) {
println!("Exit code: {}", exit_code); println!("Exit code: {}", exit_code);
} else { } else {
println!("[CRASH] exit code: {}", exit_code); println!("[CRASH] exit code: {}", exit_code);
let pushed_history = push_history(retry.history, retry.timespan); push_history(retry);
let updated_history = update_history(pushed_history); update_history(retry);
if check_history(&updated_history, retry.max_retries) { if check_history(retry) {
retry.history = updated_history;
println!("Restarting..."); println!("Restarting...");
restart(retry); restart(retry);
} else { } else {
@ -138,7 +128,7 @@ fn run_command(mut retry: Retry) {
} }
} }
fn restart(retry: Retry) { fn restart(retry: &mut Retry) {
sleep(Duration::from_secs(u64::from(retry.restart_delay))); sleep(Duration::from_secs(u64::from(retry.restart_delay)));
run_command(retry); run_command(retry);