1 pub mod ctl_manager; 2 pub mod timer_manager; 3 pub mod unit_manager; 4 5 pub use unit_manager::*; 6 7 use crate::executor::ExitStatus; 8 9 use self::timer_manager::TimerManager; 10 11 pub struct Manager; 12 13 impl Manager { 14 /// ## 检查当前DragonReach运行的项目状态,并对其分发处理 15 pub fn check_running_status() { 16 // 检查正在运行的Unit 17 let mut running_manager = RUNNING_TABLE.write().unwrap(); 18 let mut exited_unit: Vec<(usize, ExitStatus)> = Vec::new(); 19 for unit in running_manager.mut_running_table() { 20 let proc = unit.1; 21 match proc.try_wait() { 22 //进程正常退出 23 Ok(Some(status)) => { 24 //TODO:交付给相应类型的Unit类型去执行退出后的逻辑 25 exited_unit.push(( 26 *unit.0, 27 ExitStatus::from_exit_code(status.code().unwrap_or(0)), 28 )); 29 } 30 //进程错误退出(或启动失败) 31 Err(e) => { 32 eprintln!("unit error: {}", e); 33 34 //test 35 exited_unit.push((*unit.0, ExitStatus::from_exit_code(!0))); 36 } 37 //进程处于正常运行状态 38 _ => {} 39 } 40 } 41 //释放锁,以便后续删除操作能拿到锁 42 drop(running_manager); 43 44 // 处理退出的Unit 45 for tmp in exited_unit { 46 // 从运行表中擦除该unit 47 UnitManager::remove_running(tmp.0); 48 49 // 取消该任务的定时器任务 50 TimerManager::cancel_timer(tmp.0); 51 52 // 交付处理子进程退出逻辑 53 let unit = UnitManager::get_unit_with_id(&tmp.0).unwrap(); 54 unit.lock().unwrap().after_exit(tmp.1); 55 } 56 57 // 若无运行中任务,则取出IDLE任务运行 58 if UnitManager::running_count() == 0 { 59 let unit = UnitManager::pop_a_idle_service(); 60 match unit { 61 Some(unit) => { 62 let _ = unit.lock().unwrap().run(); 63 } 64 None => {} 65 } 66 } 67 } 68 69 /// ## 检查当前所有cmd进程的运行状态 70 pub fn check_cmd_proc() { 71 let mut exited = Vec::new(); 72 let mut table = CMD_PROCESS_TABLE.write().unwrap(); 73 for tuple in table.iter_mut() { 74 let mut proc = tuple.1.lock().unwrap(); 75 match proc.try_wait() { 76 // 正常运行 77 Ok(None) => {} 78 // 停止运行,从表中删除数据 79 _ => { 80 // TODO: 应该添加错误处理,有一些命令执行失败会影响服务正常运行 81 // 后续应该添加机制来执行服务相关命令启动失败的回调 82 exited.push(*tuple.0); 83 } 84 } 85 } 86 87 for id in exited { 88 table.remove(&id); 89 } 90 } 91 } 92