chitey_server/
process.rs

1use std::env;
2use std::fs::File;
3use std::io::Read;
4use std::io::Write;
5use std::process;
6
7use crate::web_server::ChiteyError;
8
9pub fn save_pid() {
10    let mut tmp_dir = env::temp_dir();
11    tmp_dir.push("chitey_api_server_pid.txt");
12    let mut file = File::create(tmp_dir.clone()).expect("create failed");
13    let pid = process::id().to_string();
14    file.write_all(pid.as_bytes()).expect("write failed");
15}
16
17pub fn load_pid() -> u32 {
18    let mut tmp_dir = env::temp_dir();
19    tmp_dir.push("chitey_api_server_pid.txt");
20    let mut file = File::open(tmp_dir).expect("open failed");
21    let mut contents = String::new();
22    file.read_to_string(&mut contents).expect("load failed");
23    let pid: u32 = contents.parse().unwrap();
24    // println!("{}", pid);
25    pid
26}
27
28pub fn kill_server() -> Result<(), ChiteyError>{
29    let pid = load_pid();
30    #[cfg(target_os = "windows")]
31    {
32        use winapi::um::handleapi::CloseHandle;
33        use winapi::um::processthreadsapi::OpenProcess;
34        use winapi::um::processthreadsapi::TerminateProcess;
35        use winapi::um::winnt::PROCESS_ALL_ACCESS;
36
37        unsafe {
38            let process_handle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
39            let mut ret: Result<(), ChiteyError> = Ok(()); 
40            if process_handle.is_null() {
41                ret = Err(ChiteyError::ServerKillError("Process does not exist".to_string()
42            ));
43            }
44
45            if TerminateProcess(process_handle, 1) == 0 {
46                ret =  Err(ChiteyError::ServerKillError(format!(
47                    "プロセスを終了できません。エラーコード: {}",
48                    std::io::Error::last_os_error()
49                )));
50            } else {
51                ret = Ok(());
52            }
53
54            // プロセスハンドルをクローズ
55            if !process_handle.is_null() {
56                CloseHandle(process_handle);
57            }
58            return ret;
59        }
60    }
61
62    #[cfg(not(target_os = "windows"))]
63    {
64        if let Err(err) = nix::sys::signal::kill(
65            nix::unistd::Pid::from_raw(pid as i32),
66            nix::sys::signal::SIGKILL,
67        ) {
68            return Err(ChiteyError::ServerKillError(format!("Failed to kill process: {}", err)));
69        }
70    }
71    // println!("kill success!!");
72    Ok(())
73}