diff --git a/internal/nodes/system_services.go b/internal/nodes/system_services.go index 26c5450..18ee34f 100644 --- a/internal/nodes/system_services.go +++ b/internal/nodes/system_services.go @@ -32,6 +32,7 @@ func init() { // SystemServiceManager 系统服务管理 type SystemServiceManager struct { + lastIsOn int // -1, 0, 1 } func NewSystemServiceManager() *SystemServiceManager { @@ -71,7 +72,8 @@ func (this *SystemServiceManager) setupSystemd(params maps.Map) error { if err != nil { return err } - config := &nodeconfigs.SystemdServiceConfig{} + + var config = &nodeconfigs.SystemdServiceConfig{} err = json.Unmarshal(data, config) if err != nil { return err @@ -85,42 +87,60 @@ func (this *SystemServiceManager) setupSystemd(params maps.Map) error { if len(systemctl) == 0 { return errors.New("can not find 'systemctl' on the system") } + + // 记录上次状态 + var isOnInt int + if config.IsOn { + isOnInt = 1 + } else { + isOnInt = 0 + } + + if this.lastIsOn == isOnInt { + return nil + } + defer func() { + this.lastIsOn = isOnInt + }() + var shortName = teaconst.SystemdServiceName var cmd = executils.NewTimeoutCmd(10*time.Second, systemctl, "is-enabled", shortName) cmd.WithStdout() err = cmd.Run() - if err != nil { - return err - } + var hasInstalled = err == nil if config.IsOn { exe, err := os.Executable() if err != nil { return err } - // 启动Service - goman.New(func() { - time.Sleep(5 * time.Second) - _ = executils.NewTimeoutCmd(30*time.Second, systemctl, "start", teaconst.SystemdServiceName).Start() - }) - - if cmd.Stdout() == "enabled" { - // 检查文件路径是否变化 + // 检查文件路径是否变化 + if hasInstalled && cmd.Stdout() == "enabled" { data, err := os.ReadFile("/etc/systemd/system/" + teaconst.SystemdServiceName + ".service") if err == nil && bytes.Index(data, []byte(exe)) > 0 { return nil } } + + // 安装服务 var manager = utils.NewServiceManager(shortName, teaconst.ProductName) err = manager.Install(exe, []string{}) if err != nil { return err } + + // 启动服务 + goman.New(func() { + time.Sleep(5 * time.Second) + _ = executils.NewTimeoutCmd(30*time.Second, systemctl, "start", teaconst.SystemdServiceName).Start() + }) } else { - var manager = utils.NewServiceManager(shortName, teaconst.ProductName) - err = manager.Uninstall() - if err != nil { - return err + if hasInstalled { + var manager = utils.NewServiceManager(shortName, teaconst.ProductName) + err = manager.Uninstall() + if err != nil { + return err + } } }