bash_go_service/backend-service/pkg/service/service.go

113 lines
2.0 KiB
Go

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(),
NewUnixSocketTask(),
}
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)
}