package service import ( "context" "fmt" "os" "os/signal" "sync" "syscall" "bash_go_service/shared/pkg/logger" ) const ( lockFile = "/tmp/bash_service.lock" ) // Task 接口定义后台任务 type Task interface { Execute(ctx context.Context) Name() string } // WorkerPool 工作池结构体 type WorkerPool struct { tasks []Task ctx context.Context cancel context.CancelFunc wg sync.WaitGroup } // NewWorkerPool 创建工作池 func NewWorkerPool(tasks []Task) *WorkerPool { ctx, cancel := context.WithCancel(context.Background()) return &WorkerPool{ tasks: tasks, ctx: ctx, cancel: cancel, } } // Start 启动工作池中的所有任务 func (wp *WorkerPool) Start() { for _, task := range wp.tasks { wp.wg.Add(1) go func(t Task) { defer wp.wg.Done() logger.Info("Starting task: %s", t.Name()) t.Execute(wp.ctx) }(task) } } // Stop 停止所有任务 func (wp *WorkerPool) Stop() { wp.cancel() wp.wg.Wait() } // Service 服务结构体 type Service struct { workerPool *WorkerPool } // NewService 创建服务实例 func NewService() *Service { tasks := []Task{ NewConfigManagerTask(), // 添加配置管理器任务 NewWelcomeTask(), } return &Service{ workerPool: NewWorkerPool(tasks), } } func CheckExistingInstance() bool { if data, err := os.ReadFile(lockFile); err == nil { existingPid := string(data) logger.Debug("Found existing instance with PID: %s", existingPid) return true } pid := os.Getpid() os.WriteFile(lockFile, []byte(fmt.Sprintf("%d", pid)), 0644) logger.Debug("Created new lock file with PID: %d", pid) return false } func Run() { service := NewService() // 信号处理 sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) // 启动所有任务 service.workerPool.Start() // 等待信号 sig := <-sigChan logger.Info("Received signal: %v", sig) // 停止所有任务 service.workerPool.Stop() cleanup() } func cleanup() { os.Remove(lockFile) }