mod.rs 3.2 KB

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