浏览代码

细化service各生命周期操作 (#11)

* 完成整体Unit文件的解析框架,完成对Service文件的解析

* 完成Service的解析,重构代码结构,优化解析错误处理

* update

* 简要的启动逻辑

* 简要的启动逻辑

* 重构整体数据结构,解决之前出现的问题

* 启动shell(不完善)

* 细化service各生命周期操作
GnoCiYeH 1 年之前
父节点
当前提交
1dcc785b2b
共有 4 个文件被更改,包括 24 次插入7 次删除
  1. 5 4
      parse_test/test.service
  2. 9 0
      src/executor/service_executor/mod.rs
  3. 9 2
      src/main.rs
  4. 1 1
      src/task/cmdtask/mod.rs

+ 5 - 4
parse_test/test.service

@@ -6,15 +6,16 @@ Documentation=https://example.com/docs/my-service.html
 [Service]
 Type=simple
 ExecStart=/bin/gdb
-ExecStartPos=/bin/gcc -v
-ExecStartPre=/bin/ls
-ExecStopPost=/bin/ls
+ExecStartPos=/bin/echo start_pos
+ExecStartPre=/bin/echo start_pre
+ExecStopPost=/bin/echo stop_pos
+ExecReload=/bin/echo reload
 WorkingDirectory=/home/heyicong/
 User=myuser
 Group=mygroup
 Environment=VAR1=value1
 Environment=VAR2=value2
-Restart=on-failure
+Restart=on-success
 RestartSec=5s
 TimeoutStartSec=10s
 TimeoutStopSec=10s

+ 9 - 0
src/executor/service_executor/mod.rs

@@ -208,6 +208,14 @@ impl ServiceExecutor {
         Ok(())
     }
 
+    fn exec_reload(service: &mut ServiceUnit) -> Result<(), RuntimeError> {
+        let cmds = service.service_part().exec_reload();
+        for cmd in cmds {
+            cmd.exec()?;
+        }
+        Ok(())
+    }
+
     //服务退出执行的逻辑(包括自然退出及显式退出)
     pub fn after_exit(service: &mut ServiceUnit, exit_status: ExitStatus) {
         //TODO: 需要考虑是否需要在此处执行退出后代码,还是只需要显式退出时才执行
@@ -215,6 +223,7 @@ impl ServiceExecutor {
 
         //判断是否需要restart,需要则再次启动服务
         if service.service_part().restart().is_restart(&exit_status) {
+            let _ = Self::exec_reload(service);
             let _ = service.run();
             return;
         }

+ 9 - 2
src/main.rs

@@ -1,5 +1,5 @@
-// #![no_std]
-// #![no_main]
+#![no_std]
+#![no_main]
 #![feature(slice_pattern)]
 
 use cfg_if::cfg_if;
@@ -141,6 +141,8 @@ fn main() {
 
 #[cfg(not(target_os = "dragonos"))]
 fn main() {
+    use std::time::Instant;
+
     use parse::UnitParser;
 
     use crate::{
@@ -187,8 +189,13 @@ fn main() {
 
     // 启动完服务后进入主循环
     loop {
+        let time = Instant::now();
+
         // 检查各服务运行状态
         Manager::check_running_status();
         //println!(".");
+
+        let t = time.elapsed().as_secs_f64();
+        println!("{}",t);
     }
 }

+ 1 - 1
src/task/cmdtask/mod.rs

@@ -1,7 +1,7 @@
 #[cfg(target_os = "dragonos")]
 use drstd as std;
 
-use std::{eprint, eprintln, process::Command, string::String, vec::Vec};
+use std::{print,println,eprint, eprintln, process::Command, string::String, vec::Vec};
 
 use crate::error::runtime_error::{RuntimeError, RuntimeErrorType};