mirror of
https://github.com/TeaOSLab/EdgeAPI.git
synced 2025-11-06 10:00:24 +08:00
使用Sock管理进程启停
This commit is contained in:
4
go.mod
4
go.mod
@@ -4,9 +4,12 @@ go 1.15
|
|||||||
|
|
||||||
replace github.com/TeaOSLab/EdgeCommon => ../EdgeCommon
|
replace github.com/TeaOSLab/EdgeCommon => ../EdgeCommon
|
||||||
|
|
||||||
|
replace github.com/TeaOSLab/EdgePlus => ../EdgePlus
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect
|
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect
|
||||||
github.com/TeaOSLab/EdgeCommon v0.0.0-00010101000000-000000000000
|
github.com/TeaOSLab/EdgeCommon v0.0.0-00010101000000-000000000000
|
||||||
|
github.com/TeaOSLab/EdgePlus v0.0.0-00010101000000-000000000000
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go v1.61.641
|
github.com/aliyun/alibaba-cloud-sdk-go v1.61.641
|
||||||
github.com/cespare/xxhash/v2 v2.1.1
|
github.com/cespare/xxhash/v2 v2.1.1
|
||||||
github.com/go-acme/lego/v4 v4.1.2
|
github.com/go-acme/lego/v4 v4.1.2
|
||||||
@@ -15,6 +18,7 @@ require (
|
|||||||
github.com/go-yaml/yaml v2.1.0+incompatible
|
github.com/go-yaml/yaml v2.1.0+incompatible
|
||||||
github.com/golang/protobuf v1.5.2
|
github.com/golang/protobuf v1.5.2
|
||||||
github.com/iwind/TeaGo v0.0.0-20210628135026-38575a4ab060
|
github.com/iwind/TeaGo v0.0.0-20210628135026-38575a4ab060
|
||||||
|
github.com/iwind/gosock v0.0.0-20210722083328-12b2d66abec3
|
||||||
github.com/lionsoul2014/ip2region v2.2.0-release+incompatible
|
github.com/lionsoul2014/ip2region v2.2.0-release+incompatible
|
||||||
github.com/mozillazg/go-pinyin v0.18.0
|
github.com/mozillazg/go-pinyin v0.18.0
|
||||||
github.com/pkg/sftp v1.12.0
|
github.com/pkg/sftp v1.12.0
|
||||||
|
|||||||
2
go.sum
2
go.sum
@@ -183,6 +183,8 @@ github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df/go.mod h1:QMZY7/J/KSQEhK
|
|||||||
github.com/iwind/TeaGo v0.0.0-20210411134150-ddf57e240c2f/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc=
|
github.com/iwind/TeaGo v0.0.0-20210411134150-ddf57e240c2f/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc=
|
||||||
github.com/iwind/TeaGo v0.0.0-20210628135026-38575a4ab060 h1:qdLtK4PDXxk2vMKkTWl5Fl9xqYuRCukzWAgJbLHdfOo=
|
github.com/iwind/TeaGo v0.0.0-20210628135026-38575a4ab060 h1:qdLtK4PDXxk2vMKkTWl5Fl9xqYuRCukzWAgJbLHdfOo=
|
||||||
github.com/iwind/TeaGo v0.0.0-20210628135026-38575a4ab060/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc=
|
github.com/iwind/TeaGo v0.0.0-20210628135026-38575a4ab060/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc=
|
||||||
|
github.com/iwind/gosock v0.0.0-20210722083328-12b2d66abec3 h1:aBSonas7vFcgTj9u96/bWGILGv1ZbUSTLiOzcI1ZT6c=
|
||||||
|
github.com/iwind/gosock v0.0.0-20210722083328-12b2d66abec3/go.mod h1:H5Q7SXwbx3a97ecJkaS2sD77gspzE7HFUafBO0peEyA=
|
||||||
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||||
github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc=
|
github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc=
|
||||||
github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik=
|
github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik=
|
||||||
|
|||||||
@@ -2,8 +2,11 @@ package apps
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/iwind/TeaGo/Tea"
|
teaconst "github.com/TeaOSLab/EdgeAPI/internal/const"
|
||||||
"github.com/iwind/TeaGo/logs"
|
"github.com/iwind/TeaGo/logs"
|
||||||
|
"github.com/iwind/TeaGo/maps"
|
||||||
|
"github.com/iwind/TeaGo/types"
|
||||||
|
"github.com/iwind/gosock/pkg/gosock"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"runtime"
|
"runtime"
|
||||||
@@ -11,7 +14,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// App命令帮助
|
// AppCmd App命令帮助
|
||||||
type AppCmd struct {
|
type AppCmd struct {
|
||||||
product string
|
product string
|
||||||
version string
|
version string
|
||||||
@@ -20,10 +23,14 @@ type AppCmd struct {
|
|||||||
appendStrings []string
|
appendStrings []string
|
||||||
|
|
||||||
directives []*Directive
|
directives []*Directive
|
||||||
|
|
||||||
|
sock *gosock.Sock
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewAppCmd() *AppCmd {
|
func NewAppCmd() *AppCmd {
|
||||||
return &AppCmd{}
|
return &AppCmd{
|
||||||
|
sock: gosock.NewTmpSock(teaconst.ProcessName),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type CommandHelpOption struct {
|
type CommandHelpOption struct {
|
||||||
@@ -31,25 +38,25 @@ type CommandHelpOption struct {
|
|||||||
Description string
|
Description string
|
||||||
}
|
}
|
||||||
|
|
||||||
// 产品
|
// Product 产品
|
||||||
func (this *AppCmd) Product(product string) *AppCmd {
|
func (this *AppCmd) Product(product string) *AppCmd {
|
||||||
this.product = product
|
this.product = product
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
// 版本
|
// Version 版本
|
||||||
func (this *AppCmd) Version(version string) *AppCmd {
|
func (this *AppCmd) Version(version string) *AppCmd {
|
||||||
this.version = version
|
this.version = version
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
// 使用方法
|
// Usage 使用方法
|
||||||
func (this *AppCmd) Usage(usage string) *AppCmd {
|
func (this *AppCmd) Usage(usage string) *AppCmd {
|
||||||
this.usage = usage
|
this.usage = usage
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
// 选项
|
// Option 选项
|
||||||
func (this *AppCmd) Option(code string, description string) *AppCmd {
|
func (this *AppCmd) Option(code string, description string) *AppCmd {
|
||||||
this.options = append(this.options, &CommandHelpOption{
|
this.options = append(this.options, &CommandHelpOption{
|
||||||
Code: code,
|
Code: code,
|
||||||
@@ -58,13 +65,13 @@ func (this *AppCmd) Option(code string, description string) *AppCmd {
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
// 附加内容
|
// Append 附加内容
|
||||||
func (this *AppCmd) Append(appendString string) *AppCmd {
|
func (this *AppCmd) Append(appendString string) *AppCmd {
|
||||||
this.appendStrings = append(this.appendStrings, appendString)
|
this.appendStrings = append(this.appendStrings, appendString)
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
// 打印
|
// Print 打印
|
||||||
func (this *AppCmd) Print() {
|
func (this *AppCmd) Print() {
|
||||||
fmt.Println(this.product + " v" + this.version)
|
fmt.Println(this.product + " v" + this.version)
|
||||||
|
|
||||||
@@ -103,7 +110,7 @@ func (this *AppCmd) Print() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加指令
|
// On 添加指令
|
||||||
func (this *AppCmd) On(arg string, callback func()) {
|
func (this *AppCmd) On(arg string, callback func()) {
|
||||||
this.directives = append(this.directives, &Directive{
|
this.directives = append(this.directives, &Directive{
|
||||||
Arg: arg,
|
Arg: arg,
|
||||||
@@ -111,7 +118,7 @@ func (this *AppCmd) On(arg string, callback func()) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 运行
|
// Run 运行
|
||||||
func (this *AppCmd) Run(main func()) {
|
func (this *AppCmd) Run(main func()) {
|
||||||
// 获取参数
|
// 获取参数
|
||||||
args := os.Args[1:]
|
args := os.Args[1:]
|
||||||
@@ -150,9 +157,6 @@ func (this *AppCmd) Run(main func()) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 记录PID
|
|
||||||
_ = this.writePid()
|
|
||||||
|
|
||||||
// 日志
|
// 日志
|
||||||
writer := new(LogWriter)
|
writer := new(LogWriter)
|
||||||
writer.Init()
|
writer.Init()
|
||||||
@@ -164,7 +168,7 @@ func (this *AppCmd) Run(main func()) {
|
|||||||
|
|
||||||
// 版本号
|
// 版本号
|
||||||
func (this *AppCmd) runVersion() {
|
func (this *AppCmd) runVersion() {
|
||||||
fmt.Println(this.product+" v"+this.version, "(build: "+runtime.Version(), runtime.GOOS, runtime.GOARCH+")")
|
fmt.Println(this.product+" v"+this.version, "(build: "+runtime.Version(), runtime.GOOS, runtime.GOARCH, teaconst.Tag+")")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 帮助
|
// 帮助
|
||||||
@@ -174,9 +178,9 @@ func (this *AppCmd) runHelp() {
|
|||||||
|
|
||||||
// 启动
|
// 启动
|
||||||
func (this *AppCmd) runStart() {
|
func (this *AppCmd) runStart() {
|
||||||
proc := this.checkPid()
|
var pid = this.getPID()
|
||||||
if proc != nil {
|
if pid > 0 {
|
||||||
fmt.Println(this.product+" already started, pid:", proc.Pid)
|
fmt.Println(this.product+" already started, pid:", pid)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,18 +196,15 @@ func (this *AppCmd) runStart() {
|
|||||||
|
|
||||||
// 停止
|
// 停止
|
||||||
func (this *AppCmd) runStop() {
|
func (this *AppCmd) runStop() {
|
||||||
proc := this.checkPid()
|
var pid = this.getPID()
|
||||||
if proc == nil {
|
if pid == 0 {
|
||||||
fmt.Println(this.product + " not started yet")
|
fmt.Println(this.product + " not started yet")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 停止进程
|
_, _ = this.sock.Send(&gosock.Command{Code: "stop"})
|
||||||
_ = proc.Kill()
|
|
||||||
|
|
||||||
// 在Windows上经常不能及时释放资源
|
fmt.Println(this.product+" stopped ok, pid:", types.String(pid))
|
||||||
_ = DeletePid(Tea.Root + "/bin/pid")
|
|
||||||
fmt.Println(this.product+" stopped ok, pid:", proc.Pid)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 重启
|
// 重启
|
||||||
@@ -215,20 +216,24 @@ func (this *AppCmd) runRestart() {
|
|||||||
|
|
||||||
// 状态
|
// 状态
|
||||||
func (this *AppCmd) runStatus() {
|
func (this *AppCmd) runStatus() {
|
||||||
proc := this.checkPid()
|
var pid = this.getPID()
|
||||||
if proc == nil {
|
if pid == 0 {
|
||||||
fmt.Println(this.product + " not started yet")
|
fmt.Println(this.product + " not started yet")
|
||||||
} else {
|
return
|
||||||
fmt.Println(this.product + " is running, pid: " + fmt.Sprintf("%d", proc.Pid))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查PID
|
fmt.Println(this.product + " is running, pid: " + types.String(pid))
|
||||||
func (this *AppCmd) checkPid() *os.Process {
|
|
||||||
return CheckPid(Tea.Root + "/bin/pid")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 写入PID
|
// 获取当前的PID
|
||||||
func (this *AppCmd) writePid() error {
|
func (this *AppCmd) getPID() int {
|
||||||
return WritePid(Tea.Root + "/bin/pid")
|
if !this.sock.IsListening() {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
reply, err := this.sock.Send(&gosock.Command{Code: "pid"})
|
||||||
|
if err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return maps.NewMap(reply.Params).GetInt("pid")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +0,0 @@
|
|||||||
// +build !windows
|
|
||||||
|
|
||||||
package apps
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
"syscall"
|
|
||||||
)
|
|
||||||
|
|
||||||
// lock file
|
|
||||||
func LockFile(fp *os.File) error {
|
|
||||||
return syscall.Flock(int(fp.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)
|
|
||||||
}
|
|
||||||
|
|
||||||
func UnlockFile(fp *os.File) error {
|
|
||||||
return syscall.Flock(int(fp.Fd()), syscall.LOCK_UN)
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
// +build windows
|
|
||||||
|
|
||||||
package apps
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"os"
|
|
||||||
)
|
|
||||||
|
|
||||||
// lock file
|
|
||||||
func LockFile(fp *os.File) error {
|
|
||||||
return errors.New("not implemented on windows")
|
|
||||||
}
|
|
||||||
|
|
||||||
func UnlockFile(fp *os.File) error {
|
|
||||||
return errors.New("not implemented on windows")
|
|
||||||
}
|
|
||||||
@@ -1,113 +0,0 @@
|
|||||||
package apps
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/iwind/TeaGo/types"
|
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
|
||||||
"runtime"
|
|
||||||
)
|
|
||||||
|
|
||||||
var pidFileList = []*os.File{}
|
|
||||||
|
|
||||||
// 检查Pid
|
|
||||||
func CheckPid(path string) *os.Process {
|
|
||||||
// windows上打开的文件是不能删除的
|
|
||||||
if runtime.GOOS == "windows" {
|
|
||||||
if os.Remove(path) == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
file, err := os.Open(path)
|
|
||||||
if err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = file.Close()
|
|
||||||
}()
|
|
||||||
|
|
||||||
// 是否能取得Lock
|
|
||||||
err = LockFile(file)
|
|
||||||
if err == nil {
|
|
||||||
_ = UnlockFile(file)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
pidBytes, err := ioutil.ReadAll(file)
|
|
||||||
if err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
pid := types.Int(string(pidBytes))
|
|
||||||
|
|
||||||
if pid <= 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
proc, _ := os.FindProcess(pid)
|
|
||||||
return proc
|
|
||||||
}
|
|
||||||
|
|
||||||
// 写入Pid
|
|
||||||
func WritePid(path string) error {
|
|
||||||
fp, err := os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY|os.O_RDONLY, 0666)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if runtime.GOOS != "windows" {
|
|
||||||
err = LockFile(fp)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pidFileList = append(pidFileList, fp) // hold the file pointers
|
|
||||||
|
|
||||||
_, err = fp.WriteString(fmt.Sprintf("%d", os.Getpid()))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 写入Ppid
|
|
||||||
func WritePpid(path string) error {
|
|
||||||
fp, err := os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY|os.O_RDONLY, 0666)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if runtime.GOOS != "windows" {
|
|
||||||
err = LockFile(fp)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pidFileList = append(pidFileList, fp) // hold the file pointers
|
|
||||||
|
|
||||||
_, err = fp.WriteString(fmt.Sprintf("%d", os.Getppid()))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 删除Pid
|
|
||||||
func DeletePid(path string) error {
|
|
||||||
_, err := os.Stat(path)
|
|
||||||
if err != nil {
|
|
||||||
if !os.IsNotExist(err) {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, fp := range pidFileList {
|
|
||||||
_ = UnlockFile(fp)
|
|
||||||
_ = fp.Close()
|
|
||||||
}
|
|
||||||
return os.Remove(path)
|
|
||||||
}
|
|
||||||
8
internal/const/build.go
Normal file
8
internal/const/build.go
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||||
|
// +build community
|
||||||
|
|
||||||
|
package teaconst
|
||||||
|
|
||||||
|
const BuildCommunity = true
|
||||||
|
const BuildPlus = false
|
||||||
|
const Tag = "community"
|
||||||
@@ -22,5 +22,5 @@ const (
|
|||||||
UserNodeVersion = "0.0.10"
|
UserNodeVersion = "0.0.10"
|
||||||
AuthorityNodeVersion = "0.0.2"
|
AuthorityNodeVersion = "0.0.2"
|
||||||
MonitorNodeVersion = "0.0.2"
|
MonitorNodeVersion = "0.0.2"
|
||||||
DNSNodeVersion = "0.0.2"
|
DNSNodeVersion = "0.0.3"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -16,8 +16,10 @@ import (
|
|||||||
"github.com/iwind/TeaGo/dbs"
|
"github.com/iwind/TeaGo/dbs"
|
||||||
"github.com/iwind/TeaGo/lists"
|
"github.com/iwind/TeaGo/lists"
|
||||||
"github.com/iwind/TeaGo/logs"
|
"github.com/iwind/TeaGo/logs"
|
||||||
|
"github.com/iwind/TeaGo/maps"
|
||||||
"github.com/iwind/TeaGo/types"
|
"github.com/iwind/TeaGo/types"
|
||||||
stringutil "github.com/iwind/TeaGo/utils/string"
|
stringutil "github.com/iwind/TeaGo/utils/string"
|
||||||
|
"github.com/iwind/gosock/pkg/gosock"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/credentials"
|
"google.golang.org/grpc/credentials"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
@@ -36,11 +38,14 @@ var sharedAPIConfig *configs.APIConfig = nil
|
|||||||
type APINode struct {
|
type APINode struct {
|
||||||
serviceInstanceMap map[string]interface{}
|
serviceInstanceMap map[string]interface{}
|
||||||
serviceInstanceLocker sync.Mutex
|
serviceInstanceLocker sync.Mutex
|
||||||
|
|
||||||
|
sock *gosock.Sock
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewAPINode() *APINode {
|
func NewAPINode() *APINode {
|
||||||
return &APINode{
|
return &APINode{
|
||||||
serviceInstanceMap: map[string]interface{}{},
|
serviceInstanceMap: map[string]interface{}{},
|
||||||
|
sock: gosock.NewTmpSock(teaconst.ProcessName),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -469,37 +474,46 @@ func (this *APINode) listenPorts(apiNode *models.APINode) (isListening bool) {
|
|||||||
|
|
||||||
// 监听本地sock
|
// 监听本地sock
|
||||||
func (this *APINode) listenSock() error {
|
func (this *APINode) listenSock() error {
|
||||||
path := os.TempDir() + "/edge-api.sock"
|
// 检查是否在运行
|
||||||
|
if this.sock.IsListening() {
|
||||||
// 检查是否已经存在
|
reply, err := this.sock.Send(&gosock.Command{Code: "pid"})
|
||||||
_, err := os.Stat(path)
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
conn, err := net.Dial("unix", path)
|
return errors.New("error: the process is already running, pid: " + maps.NewMap(reply.Params).GetString("pid"))
|
||||||
if err != nil {
|
|
||||||
_ = os.Remove(path)
|
|
||||||
} else {
|
} else {
|
||||||
_ = conn.Close()
|
return errors.New("error: the process is already running")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新的监听任务
|
// 启动监听
|
||||||
listener, err := net.Listen("unix", path)
|
go func() {
|
||||||
if err != nil {
|
this.sock.OnCommand(func(cmd *gosock.Command) {
|
||||||
return err
|
switch cmd.Code {
|
||||||
|
case "pid":
|
||||||
|
_ = cmd.Reply(&gosock.Command{
|
||||||
|
Code: "pid",
|
||||||
|
Params: map[string]interface{}{
|
||||||
|
"pid": os.Getpid(),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
case "stop":
|
||||||
|
_ = cmd.ReplyOk()
|
||||||
|
|
||||||
|
// 退出主进程
|
||||||
|
events.Notify(events.EventQuit)
|
||||||
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
events.On(events.EventQuit, func() {
|
|
||||||
remotelogs.Println("API_NODE", "quit unix sock")
|
|
||||||
_ = listener.Close()
|
|
||||||
})
|
})
|
||||||
|
|
||||||
go func() {
|
err := this.sock.Listen()
|
||||||
for {
|
|
||||||
_, err := listener.Accept()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
logs.Println("NODE", err.Error())
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
events.On(events.EventQuit, func() {
|
||||||
|
logs.Println("NODE", "quit unix sock")
|
||||||
|
_ = this.sock.Close()
|
||||||
|
})
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user