From 4fc7a30d374d2a2bc6d98cf42d5b6fef4778ae30 Mon Sep 17 00:00:00 2001 From: "qcqcqc@wsl" <1220204124@zust.edu.cn> Date: Sat, 12 Apr 2025 00:20:17 +0800 Subject: [PATCH] =?UTF-8?q?daemon=E8=BF=9B=E7=A8=8B=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend-service/cmd/main.go | 65 ++++++++++++++++++++++++--------- welcome-service.log | 71 ------------------------------------- 2 files changed, 48 insertions(+), 88 deletions(-) delete mode 100644 welcome-service.log diff --git a/backend-service/cmd/main.go b/backend-service/cmd/main.go index bc8762e..fd9ba50 100644 --- a/backend-service/cmd/main.go +++ b/backend-service/cmd/main.go @@ -4,6 +4,7 @@ import ( "fmt" "os" "os/exec" + "os/signal" "path/filepath" "strconv" "strings" @@ -17,6 +18,8 @@ import ( "bash_go_service/shared/pkg/logger" "github.com/spf13/viper" + + "golang.org/x/sys/unix" ) // isDaemon 检查是否以守护进程模式运行 @@ -33,6 +36,13 @@ func init() { logger.Error("Error starting daemon.") 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() } } @@ -109,32 +119,46 @@ func checkExistingProcess() error { pidFile := constants.PidFilePath pidBytes, err := os.ReadFile(pidFile) if err != nil { + logger.Debug("Pid file not exist.") + // 如果文件不存在,直接返回,不做任何处理 if os.IsNotExist(err) { return nil } 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 { - return fmt.Errorf("parse pid: %w", err) + logger.Debug("Pid file is broken.") + // PID 文件损坏,直接删除 + os.Remove(pidFile) + return nil } process, err := os.FindProcess(pid) 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) - return fmt.Errorf("daemon already running") + // 更可靠的进程检测方式 + if err := unix.Kill(pid, 0); err != nil { + 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.Error("Failed to remove old PID file: %v", err) - } - return nil + // 进程确实存在 + logger.Info("Daemon already running with PID: %d", pid) + return fmt.Errorf("daemon already running") } func formatGoTime(format string) string { @@ -177,18 +201,25 @@ func startDaemonProcess() error { 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 } // runDaemon 守护进程主逻辑 func runDaemon() { 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() } diff --git a/welcome-service.log b/welcome-service.log deleted file mode 100644 index ffe244a..0000000 --- a/welcome-service.log +++ /dev/null @@ -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