Skip to content
This repository has been archived by the owner on Jan 22, 2025. It is now read-only.

Commit

Permalink
run command now kills child process on SIGTERM to cleanly exit
Browse files Browse the repository at this point in the history
  • Loading branch information
mvines committed Jul 1, 2019
1 parent 0c8f187 commit cb522c3
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 2 deletions.
27 changes: 27 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions install/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ ring = "0.13.2"
serde = "1.0.94"
serde_derive = "1.0.94"
serde_yaml = "0.8.9"
signal-hook = "0.1.9"
solana-client = { path = "../client", version = "0.17.0" }
solana-config-api = { path = "../programs/config_api", version = "0.17.0" }
solana-logger = { path = "../logger", version = "0.17.0" }
Expand Down
29 changes: 27 additions & 2 deletions install/src/command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ use solana_sdk::transaction::Transaction;
use std::fs::{self, File};
use std::io::{self, BufReader, Read};
use std::path::{Path, PathBuf};
use std::thread::sleep;
use std::sync::mpsc;
use std::time::SystemTime;
use std::time::{Duration, Instant};
use tempdir::TempDir;
Expand Down Expand Up @@ -759,6 +759,19 @@ pub fn run(

let mut child_option: Option<std::process::Child> = None;
let mut now = Instant::now();

let (signal_sender, signal_receiver) = mpsc::channel();
if !cfg!(windows) {
use signal_hook::{iterator::Signals, SIGTERM};
let signals = Signals::new(&[SIGTERM]).unwrap();
std::thread::spawn(move || {
for sig in signals.forever() {
eprintln!("run: received signal {:?}", sig);
let _ = signal_sender.send(());
}
});
}

loop {
child_option = match child_option {
Some(mut child) => match child.try_wait() {
Expand Down Expand Up @@ -806,6 +819,18 @@ pub fn run(
};
now = Instant::now();
}
sleep(Duration::from_secs(1));

match signal_receiver.recv_timeout(Duration::from_secs(1)) {
Ok(()) => {
// Handle SIGTERM...
if let Some(ref mut child) = child_option {
stop_process(child).unwrap_or_else(|err| {
eprintln!("Failed to stop child: {:?}", err);
});
}
std::process::exit(0);
}
Err(_) => {}
};
}
}

0 comments on commit cb522c3

Please sign in to comment.