daemon进程逻辑优化
This commit is contained in:
parent
cc33b9c94a
commit
4fc7a30d37
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
Loading…
Reference in New Issue