113 lines
2.0 KiB
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)
|
|
}
|