citahub / cita-forever

Guarding CITA is running all the time
https://github.com/cryptape/cita
Apache License 2.0
6 stars 16 forks source link

当存在 .pid 文件时,启动微服务可能出错 #38

Closed leeyr338 closed 5 years ago

leeyr338 commented 5 years ago

启动微服务出错场景:

  1. 节点目录下存在 .pid 文件;
  2. 在微服务启动前,存在一个与 .pid 文件中 pid 号相同的进程已经在执行;

以上场景会导致微服务启动失败,出错信息为:

WARN - cita-network already started, pid is 5617

其实这时,微服务是没有启动的。 见: https://talk.citahub.com/t/topic/523/5 https://github.com/cryptape/cita/issues/407

更多信息: 程序在 check_process 中处理逻辑不正确。

// whether process exsit
fn check_process(pidfile: String) -> Option<u32> {
    // read pid from pidfile
    let pid: u32 = read_pid(pidfile);
    if pid == 0 {
        None
    } else {
        let pid_str = pid.to_string();
        let args = vec!["-p", &pid_str, "-o", "pid="];
        let output = Command::new("ps")
            .args(args)
            .output()
            .expect("failed to execute ps -p");
        if output.status.success() {
            let otpt_str = String::from_utf8(output.stdout).unwrap();
            if otpt_str.contains(&pid.to_string()) {
                Some(pid)
            } else {
                None
            }
        } else {
            None
        }
    }
}

程序需要检查 pid 号外,还需检查微服务名是否一致,才能判定微服务已经启动。

kaikai1024 commented 5 years ago

程序在 check_process 中处理逻辑不正确。

What about this?