fix: agent deamon build
This commit is contained in:
+6
-3
@@ -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
@@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user