fix: agent deamon build

This commit is contained in:
engigu
2026-02-27 10:16:27 +08:00
parent fbaf7ff0d4
commit 1a011bb5af
4 changed files with 20 additions and 22 deletions
+6 -3
View File
@@ -9,6 +9,7 @@ import (
"os/exec"
"os/signal"
"path/filepath"
"reflect"
"syscall"
"time"
@@ -312,10 +313,12 @@ func startDaemon() {
Stderr: devNull,
}
// 设置进程组,使子进程独立运行
cmd.SysProcAttr = &syscall.SysProcAttr{
Setsid: true,
// 设置进程组,使子进程独立运行 (跨平台兼容写法)
attr := &syscall.SysProcAttr{}
if field := reflect.ValueOf(attr).Elem().FieldByName("Setsid"); field.IsValid() {
field.SetBool(true)
}
cmd.SysProcAttr = attr
if err := cmd.Start(); err != nil {
fmt.Printf("启动失败: %v\n", err)
+11 -19
View File
@@ -8,11 +8,13 @@ import (
"runtime"
"strconv"
"syscall"
"github.com/gofrs/flock"
)
// ========== PID 文件管理 ==========
var pidFileLock *os.File
var fileLock *flock.Flock
func getPidFile() string {
return filepath.Join(dataDir, "agent.pid")
@@ -25,31 +27,21 @@ func getLockFile() string {
// tryLock 尝试获取文件锁,确保只有一个实例运行
func tryLock() bool {
os.MkdirAll(dataDir, 0755)
lockFile := getLockFile()
var err error
pidFileLock, err = os.OpenFile(lockFile, os.O_CREATE|os.O_RDWR, 0644)
if err != nil {
fileLock = flock.New(getLockFile())
locked, err := fileLock.TryLock()
if err != nil || !locked {
fileLock = nil
return false
}
// 尝试获取排他锁(非阻塞)
err = syscall.Flock(int(pidFileLock.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)
if err != nil {
pidFileLock.Close()
pidFileLock = nil
return false
}
return true
}
// unlock 释放文件锁
func unlock() {
if pidFileLock != nil {
syscall.Flock(int(pidFileLock.Fd()), syscall.LOCK_UN)
pidFileLock.Close()
pidFileLock = nil
if fileLock != nil {
fileLock.Unlock()
fileLock = nil
os.Remove(getLockFile())
}
}