Add thread for watching child process
This commit is contained in:
parent
1bed74a34e
commit
6d63ee291c
1 changed files with 20 additions and 10 deletions
30
src/main.rs
30
src/main.rs
|
@ -3,10 +3,10 @@ use std::env;
|
||||||
use std::fs::remove_file;
|
use std::fs::remove_file;
|
||||||
use std::io::{BufRead, BufReader, Write};
|
use std::io::{BufRead, BufReader, Write};
|
||||||
use std::os::unix::net::{UnixListener, UnixStream};
|
use std::os::unix::net::{UnixListener, UnixStream};
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::PathBuf;
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
use std::thread;
|
use std::thread;
|
||||||
use std::time::{SystemTime, UNIX_EPOCH};
|
use std::time::{Duration, SystemTime, UNIX_EPOCH};
|
||||||
|
|
||||||
const ENV_VAR: &str = "IPC_SOCK_PATH";
|
const ENV_VAR: &str = "IPC_SOCK_PATH";
|
||||||
|
|
||||||
|
@ -41,10 +41,6 @@ impl SocketServer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn path(&self) -> &Path {
|
|
||||||
&self.socket_path
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for SocketServer {
|
impl Drop for SocketServer {
|
||||||
|
@ -81,16 +77,30 @@ fn client(path: String) {
|
||||||
stream.write_all(b"Hello World").unwrap();
|
stream.write_all(b"Hello World").unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn monitor_child(socket_path: PathBuf) {
|
||||||
|
loop {
|
||||||
|
println!("Starting child process");
|
||||||
|
let mut child_proc = Command::new(env::current_exe().unwrap())
|
||||||
|
.env(ENV_VAR, &socket_path)
|
||||||
|
.spawn()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
child_proc.wait().unwrap();
|
||||||
|
|
||||||
|
println!("Child process died");
|
||||||
|
|
||||||
|
thread::sleep(Duration::from_secs(5));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
if let Ok(path) = env::var(ENV_VAR) {
|
if let Ok(path) = env::var(ENV_VAR) {
|
||||||
client(path);
|
client(path);
|
||||||
} else {
|
} else {
|
||||||
let server = SocketServer::new();
|
let server = SocketServer::new();
|
||||||
|
|
||||||
let _child = Command::new(env::current_exe().unwrap())
|
let socket_path = server.socket_path.clone();
|
||||||
.env(ENV_VAR, server.path())
|
thread::spawn(|| monitor_child(socket_path));
|
||||||
.spawn()
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
server.run();
|
server.run();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue