daemon进程逻辑优化

This commit is contained in:
Pan Qiancheng 2025-04-12 00:20:17 +08:00
parent cc33b9c94a
commit 4fc7a30d37
2 changed files with 48 additions and 88 deletions

View File

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"os" "os"
"os/exec" "os/exec"
"os/signal"
"path/filepath" "path/filepath"
"strconv" "strconv"
"strings" "strings"
@ -17,6 +18,8 @@ import (
"bash_go_service/shared/pkg/logger" "bash_go_service/shared/pkg/logger"
"github.com/spf13/viper" "github.com/spf13/viper"
"golang.org/x/sys/unix"
) )
// isDaemon 检查是否以守护进程模式运行 // isDaemon 检查是否以守护进程模式运行
@ -33,6 +36,13 @@ func init() {
logger.Error("Error starting daemon.") logger.Error("Error starting daemon.")
return return
} }
pid := os.Getpid()
// 写入 PID 文件
pidStr := []byte(fmt.Sprintf("%d", pid))
if err := os.WriteFile(constants.PidFilePath, pidStr, constants.LogFileMode); err != nil {
logger.Error("Failed to write PID file: %v", err)
os.Exit(1)
}
runDaemon() runDaemon()
} }
} }
@ -109,32 +119,46 @@ func checkExistingProcess() error {
pidFile := constants.PidFilePath pidFile := constants.PidFilePath
pidBytes, err := os.ReadFile(pidFile) pidBytes, err := os.ReadFile(pidFile)
if err != nil { if err != nil {
logger.Debug("Pid file not exist.")
// 如果文件不存在,直接返回,不做任何处理
if os.IsNotExist(err) { if os.IsNotExist(err) {
return nil return nil
} }
return fmt.Errorf("read pid file: %w", err) return fmt.Errorf("read pid file: %w", err)
} }
pid, err := strconv.Atoi(string(pidBytes)) pid, err := strconv.Atoi(strings.TrimSpace(string(pidBytes)))
if err != nil { if err != nil {
return fmt.Errorf("parse pid: %w", err) logger.Debug("Pid file is broken.")
// PID 文件损坏,直接删除
os.Remove(pidFile)
return nil
} }
process, err := os.FindProcess(pid) process, err := os.FindProcess(pid)
if err != nil { if err != nil {
return fmt.Errorf("find process: %w", err) logger.Debug("Process not found.")
// 进程不存在,删除 PID 文件
os.Remove(pidFile)
return nil
} else {
logger.Debug("Process found, pid is: %d", process.Pid)
} }
if err := process.Signal(syscall.Signal(0)); err == nil { // 更可靠的进程检测方式
logger.Info("Daemon already running with PID: %d", pid) if err := unix.Kill(pid, 0); err != nil {
return fmt.Errorf("daemon already running") logger.Debug("Kill process error: %v", err)
if err == unix.ESRCH {
logger.Debug("Process not exist.")
// 进程不存在,删除 PID 文件
os.Remove(pidFile)
return nil
}
} }
// 进程不存在删除PID文件 // 进程确实存在
if err := os.Remove(pidFile); err != nil { logger.Info("Daemon already running with PID: %d", pid)
logger.Error("Failed to remove old PID file: %v", err) return fmt.Errorf("daemon already running")
}
return nil
} }
func formatGoTime(format string) string { func formatGoTime(format string) string {
@ -177,18 +201,25 @@ func startDaemonProcess() error {
return fmt.Errorf("start daemon: %w", err) return fmt.Errorf("start daemon: %w", err)
} }
// 写入 PID 文件
pidStr := []byte(fmt.Sprintf("%d", cmd.Process.Pid))
if err := os.WriteFile(constants.PidFilePath, pidStr, constants.LogFileMode); err != nil {
return fmt.Errorf("write pid file: %w", err)
}
return nil return nil
} }
// runDaemon 守护进程主逻辑 // runDaemon 守护进程主逻辑
func runDaemon() { func runDaemon() {
logger.Info("Daemon started with PID: %d", os.Getpid()) logger.Info("Daemon started with PID: %d", os.Getpid())
// 设置信号处理
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT)
go func() {
sig := <-sigChan
logger.Info("Received signal: %v", sig)
// 清理 PID 文件
os.Remove(constants.PidFilePath)
os.Exit(0)
}()
service.Run() service.Run()
} }

View File

@ -1,71 +0,0 @@
2025/04/11 23:18:24 Service started
2025/04/11 23:18:25 Error opening terminal /dev/pts/ptmx: open /dev/pts/ptmx: permission denied
2025/04/11 23:18:25 Welcome message sent to /dev/pts/20
2025/04/11 23:18:25 Welcome message sent to /dev/pts/19
2025/04/11 23:18:25 Welcome message sent to /dev/pts/6
2025/04/11 23:18:25 Welcome message sent to /dev/pts/7
2025/04/11 23:18:25 Welcome message sent to /dev/pts/9
2025/04/11 23:18:25 Welcome message sent to /dev/pts/18
2025/04/11 23:18:25 Welcome message sent to /dev/pts/2
2025/04/11 23:18:25 Welcome message sent to /dev/pts/14
2025/04/11 23:18:25 Welcome message sent to /dev/pts/13
2025/04/11 23:18:25 Welcome message sent to /dev/pts/3
2025/04/11 23:18:25 Welcome message sent to /dev/pts/1
2025/04/11 23:18:25 Welcome message sent to /dev/pts/11
2025/04/11 23:18:25 Welcome message sent to /dev/pts/15
2025/04/11 23:18:25 Welcome message sent to /dev/pts/21
2025/04/11 23:18:25 Welcome message sent to /dev/pts/10
2025/04/11 23:18:25 Welcome message sent to /dev/pts/12
2025/04/11 23:18:25 Welcome message sent to /dev/pts/8
2025/04/11 23:18:25 Welcome message sent to /dev/pts/0
2025/04/11 23:18:28 Welcome message sent to /dev/pts/4
2025/04/11 23:18:34 Welcome message sent to /dev/pts/5
2025/04/11 23:19:45 Welcome message sent to /dev/pts/22
2025/04/11 23:20:00 Welcome message sent to /dev/pts/5
2025/04/11 23:24:13 Received signal: interrupt
2025/04/11 23:24:14 Service started
2025/04/11 23:24:15 Error opening terminal /dev/pts/ptmx: open /dev/pts/ptmx: permission denied
2025/04/11 23:24:15 Welcome message sent to /dev/pts/9
2025/04/11 23:24:15 Welcome message sent to /dev/pts/15
2025/04/11 23:24:15 Welcome message sent to /dev/pts/19
2025/04/11 23:24:15 Welcome message sent to /dev/pts/0
2025/04/11 23:24:15 Welcome message sent to /dev/pts/3
2025/04/11 23:24:15 Welcome message sent to /dev/pts/7
2025/04/11 23:24:15 Welcome message sent to /dev/pts/6
2025/04/11 23:24:15 Welcome message sent to /dev/pts/1
2025/04/11 23:24:15 Welcome message sent to /dev/pts/10
2025/04/11 23:24:15 Welcome message sent to /dev/pts/8
2025/04/11 23:24:15 Welcome message sent to /dev/pts/21
2025/04/11 23:24:15 Welcome message sent to /dev/pts/18
2025/04/11 23:24:15 Welcome message sent to /dev/pts/11
2025/04/11 23:24:15 Welcome message sent to /dev/pts/4
2025/04/11 23:24:15 Welcome message sent to /dev/pts/2
2025/04/11 23:24:15 Welcome message sent to /dev/pts/13
2025/04/11 23:24:15 Welcome message sent to /dev/pts/12
2025/04/11 23:24:15 Welcome message sent to /dev/pts/20
2025/04/11 23:24:15 Welcome message sent to /dev/pts/14
2025/04/11 23:24:24 Welcome message sent to /dev/pts/5
2025/04/11 23:25:50 Received signal: interrupt
2025/04/11 23:25:51 Service started
2025/04/11 23:25:52 Welcome message sent to /dev/pts/11
2025/04/11 23:25:52 Welcome message sent to /dev/pts/18
2025/04/11 23:25:52 Welcome message sent to /dev/pts/4
2025/04/11 23:25:52 Welcome message sent to /dev/pts/10
2025/04/11 23:25:52 Error opening terminal /dev/pts/ptmx: open /dev/pts/ptmx: permission denied
2025/04/11 23:25:52 Welcome message sent to /dev/pts/15
2025/04/11 23:25:52 Welcome message sent to /dev/pts/6
2025/04/11 23:25:52 Welcome message sent to /dev/pts/2
2025/04/11 23:25:52 Welcome message sent to /dev/pts/1
2025/04/11 23:25:52 Welcome message sent to /dev/pts/7
2025/04/11 23:25:52 Welcome message sent to /dev/pts/5
2025/04/11 23:25:52 Welcome message sent to /dev/pts/0
2025/04/11 23:25:52 Welcome message sent to /dev/pts/8
2025/04/11 23:25:52 Welcome message sent to /dev/pts/20
2025/04/11 23:25:52 Welcome message sent to /dev/pts/21
2025/04/11 23:25:52 Welcome message sent to /dev/pts/3
2025/04/11 23:25:52 Welcome message sent to /dev/pts/19
2025/04/11 23:25:52 Welcome message sent to /dev/pts/9
2025/04/11 23:25:52 Welcome message sent to /dev/pts/14
2025/04/11 23:25:52 Welcome message sent to /dev/pts/12
2025/04/11 23:25:52 Welcome message sent to /dev/pts/13
2025/04/11 23:28:16 Received signal: interrupt