Add worker monitor. Fix #284
This commit is contained in:
		
							parent
							
								
									aa366cb916
								
							
						
					
					
						commit
						921c39ba4e
					
				
							
								
								
									
										21
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								src/main.rs
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -381,10 +381,27 @@ fn daemon_main(config_set: ConfigSet) {
 | 
			
		|||
    info!("spawning worker process...");
 | 
			
		||||
 | 
			
		||||
    let espanso_path = std::env::current_exe().expect("unable to obtain espanso path location");
 | 
			
		||||
    crate::process::spawn_process(
 | 
			
		||||
    let mut child = crate::process::spawn_process(
 | 
			
		||||
        &espanso_path.to_string_lossy().to_string(),
 | 
			
		||||
        &vec!["worker".to_owned()],
 | 
			
		||||
    );
 | 
			
		||||
    ).expect("unable to create worker process");
 | 
			
		||||
 | 
			
		||||
    // Create a monitor thread that will exit with the same non-zero code if
 | 
			
		||||
    // the worker thread exits
 | 
			
		||||
    thread::Builder::new()
 | 
			
		||||
        .name("worker monitor".to_string())
 | 
			
		||||
        .spawn(move || {
 | 
			
		||||
            let result = child.wait();
 | 
			
		||||
            if let Ok(status) = result {
 | 
			
		||||
                if let Some(code) = status.code() {
 | 
			
		||||
                    if code != 0 {
 | 
			
		||||
                        error!("worker process exited with non-zero code: {}, exiting", code);
 | 
			
		||||
                        std::process::exit(code);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
        .expect("Unable to spawn worker monitor thread");
 | 
			
		||||
 | 
			
		||||
    std::thread::sleep(Duration::from_millis(200));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,10 +18,13 @@
 | 
			
		|||
 */
 | 
			
		||||
 | 
			
		||||
use log::warn;
 | 
			
		||||
use std::process::{Command, Stdio, Child};
 | 
			
		||||
use widestring::WideCString;
 | 
			
		||||
use std::io;
 | 
			
		||||
 | 
			
		||||
#[cfg(target_os = "windows")]
 | 
			
		||||
pub fn spawn_process(cmd: &str, args: &Vec<String>) {
 | 
			
		||||
    // TODO: modify with https://doc.rust-lang.org/std/os/windows/process/trait.CommandExt.html
 | 
			
		||||
    let quoted_args: Vec<String> = args.iter().map(|arg| format!("\"{}\"", arg)).collect();
 | 
			
		||||
    let quoted_args = quoted_args.join(" ");
 | 
			
		||||
    let final_cmd = format!("\"{}\" {}", cmd, quoted_args);
 | 
			
		||||
| 
						 | 
				
			
			@ -39,8 +42,6 @@ pub fn spawn_process(cmd: &str, args: &Vec<String>) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
#[cfg(not(target_os = "windows"))]
 | 
			
		||||
pub fn spawn_process(cmd: &str, args: &Vec<String>) {
 | 
			
		||||
    use std::process::{Command, Stdio};
 | 
			
		||||
 | 
			
		||||
    Command::new(cmd).args(args).spawn();
 | 
			
		||||
pub fn spawn_process(cmd: &str, args: &Vec<String>) -> io::Result<Child> {
 | 
			
		||||
    Command::new(cmd).args(args).spawn()
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user