fix: agent deamon build
This commit is contained in:
+6
-3
@@ -9,6 +9,7 @@ import (
|
|||||||
"os/exec"
|
"os/exec"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"reflect"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -312,10 +313,12 @@ func startDaemon() {
|
|||||||
Stderr: devNull,
|
Stderr: devNull,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置进程组,使子进程独立运行
|
// 设置进程组,使子进程独立运行 (跨平台兼容写法)
|
||||||
cmd.SysProcAttr = &syscall.SysProcAttr{
|
attr := &syscall.SysProcAttr{}
|
||||||
Setsid: true,
|
if field := reflect.ValueOf(attr).Elem().FieldByName("Setsid"); field.IsValid() {
|
||||||
|
field.SetBool(true)
|
||||||
}
|
}
|
||||||
|
cmd.SysProcAttr = attr
|
||||||
|
|
||||||
if err := cmd.Start(); err != nil {
|
if err := cmd.Start(); err != nil {
|
||||||
fmt.Printf("启动失败: %v\n", err)
|
fmt.Printf("启动失败: %v\n", err)
|
||||||
|
|||||||
+11
-19
@@ -8,11 +8,13 @@ import (
|
|||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
|
"github.com/gofrs/flock"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ========== PID 文件管理 ==========
|
// ========== PID 文件管理 ==========
|
||||||
|
|
||||||
var pidFileLock *os.File
|
var fileLock *flock.Flock
|
||||||
|
|
||||||
func getPidFile() string {
|
func getPidFile() string {
|
||||||
return filepath.Join(dataDir, "agent.pid")
|
return filepath.Join(dataDir, "agent.pid")
|
||||||
@@ -25,31 +27,21 @@ func getLockFile() string {
|
|||||||
// tryLock 尝试获取文件锁,确保只有一个实例运行
|
// tryLock 尝试获取文件锁,确保只有一个实例运行
|
||||||
func tryLock() bool {
|
func tryLock() bool {
|
||||||
os.MkdirAll(dataDir, 0755)
|
os.MkdirAll(dataDir, 0755)
|
||||||
lockFile := getLockFile()
|
|
||||||
|
fileLock = flock.New(getLockFile())
|
||||||
var err error
|
locked, err := fileLock.TryLock()
|
||||||
pidFileLock, err = os.OpenFile(lockFile, os.O_CREATE|os.O_RDWR, 0644)
|
if err != nil || !locked {
|
||||||
if err != nil {
|
fileLock = nil
|
||||||
return false
|
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
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// unlock 释放文件锁
|
// unlock 释放文件锁
|
||||||
func unlock() {
|
func unlock() {
|
||||||
if pidFileLock != nil {
|
if fileLock != nil {
|
||||||
syscall.Flock(int(pidFileLock.Fd()), syscall.LOCK_UN)
|
fileLock.Unlock()
|
||||||
pidFileLock.Close()
|
fileLock = nil
|
||||||
pidFileLock = nil
|
|
||||||
os.Remove(getLockFile())
|
os.Remove(getLockFile())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ require (
|
|||||||
github.com/go-sql-driver/mysql v1.9.3 // indirect
|
github.com/go-sql-driver/mysql v1.9.3 // indirect
|
||||||
github.com/gobwas/glob v0.2.3 // indirect
|
github.com/gobwas/glob v0.2.3 // indirect
|
||||||
github.com/goccy/go-json v0.10.2 // indirect
|
github.com/goccy/go-json v0.10.2 // indirect
|
||||||
|
github.com/gofrs/flock v0.13.0 // indirect
|
||||||
github.com/gohugoio/hugo v0.149.1 // indirect
|
github.com/gohugoio/hugo v0.149.1 // indirect
|
||||||
github.com/google/uuid v1.6.0 // indirect
|
github.com/google/uuid v1.6.0 // indirect
|
||||||
github.com/jackc/pgpassfile v1.0.0 // indirect
|
github.com/jackc/pgpassfile v1.0.0 // indirect
|
||||||
|
|||||||
@@ -108,6 +108,8 @@ github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
|
|||||||
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
|
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
|
||||||
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
|
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
|
||||||
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
||||||
|
github.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw=
|
||||||
|
github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0=
|
||||||
github.com/gohugoio/go-i18n/v2 v2.1.3-0.20230805085216-e63c13218d0e h1:QArsSubW7eDh8APMXkByjQWvuljwPGAGQpJEFn0F0wY=
|
github.com/gohugoio/go-i18n/v2 v2.1.3-0.20230805085216-e63c13218d0e h1:QArsSubW7eDh8APMXkByjQWvuljwPGAGQpJEFn0F0wY=
|
||||||
github.com/gohugoio/go-i18n/v2 v2.1.3-0.20230805085216-e63c13218d0e/go.mod h1:3Ltoo9Banwq0gOtcOwxuHG6omk+AwsQPADyw2vQYOJQ=
|
github.com/gohugoio/go-i18n/v2 v2.1.3-0.20230805085216-e63c13218d0e/go.mod h1:3Ltoo9Banwq0gOtcOwxuHG6omk+AwsQPADyw2vQYOJQ=
|
||||||
github.com/gohugoio/hashstructure v0.5.0 h1:G2fjSBU36RdwEJBWJ+919ERvOVqAg9tfcYp47K9swqg=
|
github.com/gohugoio/hashstructure v0.5.0 h1:G2fjSBU36RdwEJBWJ+919ERvOVqAg9tfcYp47K9swqg=
|
||||||
|
|||||||
Reference in New Issue
Block a user