增加service命令

This commit is contained in:
刘祥超
2021-01-12 11:48:38 +08:00
parent b975dd48c9
commit 13e5db4729
3 changed files with 75 additions and 47 deletions

View File

@@ -7,22 +7,17 @@ import (
"github.com/TeaOSLab/EdgeNode/internal/nodes" "github.com/TeaOSLab/EdgeNode/internal/nodes"
"github.com/iwind/TeaGo/Tea" "github.com/iwind/TeaGo/Tea"
_ "github.com/iwind/TeaGo/bootstrap" _ "github.com/iwind/TeaGo/bootstrap"
"github.com/iwind/TeaGo/lists"
"github.com/iwind/TeaGo/types" "github.com/iwind/TeaGo/types"
"io/ioutil" "io/ioutil"
"log"
"net"
"os" "os"
"os/exec"
"syscall" "syscall"
"time"
) )
func main() { func main() {
app := apps.NewAppCmd(). app := apps.NewAppCmd().
Version(teaconst.Version). Version(teaconst.Version).
Product(teaconst.ProductName). Product(teaconst.ProductName).
Usage(teaconst.ProcessName + " [-v|start|stop|restart|quit|test|daemon]") Usage(teaconst.ProcessName + " [-v|start|stop|restart|quit|test|service|daemon]")
app.On("test", func() { app.On("test", func() {
err := nodes.NewNode().Test() err := nodes.NewNode().Test()
@@ -31,47 +26,14 @@ func main() {
} }
}) })
app.On("daemon", func() { app.On("daemon", func() {
path := os.TempDir() + "/edge-node.sock" nodes.NewNode().Daemon()
isDebug := lists.ContainsString(os.Args, "debug") })
isDebug = true app.On("service", func() {
for { err := nodes.NewNode().InstallSystemService()
conn, err := net.DialTimeout("unix", path, 1*time.Second)
if err != nil { if err != nil {
if isDebug { fmt.Println("[ERROR]install failed: " + err.Error())
log.Println("[DAEMON]starting ...")
}
// 尝试启动
err = func() error {
exe, err := os.Executable()
if err != nil {
return err
}
cmd := exec.Command(exe)
err = cmd.Start()
if err != nil {
return err
}
err = cmd.Wait()
if err != nil {
return err
}
return nil
}()
if err != nil {
if isDebug {
log.Println("[DAEMON]", err)
}
time.Sleep(1 * time.Second)
} else {
time.Sleep(5 * time.Second)
}
} else {
_ = conn.Close()
time.Sleep(5 * time.Second)
}
} }
fmt.Println("done")
}) })
app.On("quit", func() { app.On("quit", func() {
pidFile := Tea.Root + "/bin/pid" pidFile := Tea.Root + "/bin/pid"

View File

@@ -10,16 +10,20 @@ import (
"github.com/TeaOSLab/EdgeNode/internal/apps" "github.com/TeaOSLab/EdgeNode/internal/apps"
"github.com/TeaOSLab/EdgeNode/internal/caches" "github.com/TeaOSLab/EdgeNode/internal/caches"
"github.com/TeaOSLab/EdgeNode/internal/configs" "github.com/TeaOSLab/EdgeNode/internal/configs"
teaconst "github.com/TeaOSLab/EdgeNode/internal/const"
"github.com/TeaOSLab/EdgeNode/internal/events" "github.com/TeaOSLab/EdgeNode/internal/events"
"github.com/TeaOSLab/EdgeNode/internal/remotelogs" "github.com/TeaOSLab/EdgeNode/internal/remotelogs"
"github.com/TeaOSLab/EdgeNode/internal/rpc" "github.com/TeaOSLab/EdgeNode/internal/rpc"
"github.com/TeaOSLab/EdgeNode/internal/utils" "github.com/TeaOSLab/EdgeNode/internal/utils"
"github.com/go-yaml/yaml" "github.com/go-yaml/yaml"
"github.com/iwind/TeaGo/Tea" "github.com/iwind/TeaGo/Tea"
"github.com/iwind/TeaGo/lists"
"github.com/iwind/TeaGo/logs" "github.com/iwind/TeaGo/logs"
"io/ioutil" "io/ioutil"
"log"
"net" "net"
"os" "os"
"os/exec"
"os/signal" "os/signal"
"runtime" "runtime"
"syscall" "syscall"
@@ -135,6 +139,68 @@ func (this *Node) Start() {
select {} select {}
} }
// 实现守护进程
func (this *Node) Daemon() {
path := os.TempDir() + "/edge-node.sock"
isDebug := lists.ContainsString(os.Args, "debug")
isDebug = true
for {
conn, err := net.DialTimeout("unix", path, 1*time.Second)
if err != nil {
if isDebug {
log.Println("[DAEMON]starting ...")
}
// 尝试启动
err = func() error {
exe, err := os.Executable()
if err != nil {
return err
}
cmd := exec.Command(exe)
err = cmd.Start()
if err != nil {
return err
}
err = cmd.Wait()
if err != nil {
return err
}
return nil
}()
if err != nil {
if isDebug {
log.Println("[DAEMON]", err)
}
time.Sleep(1 * time.Second)
} else {
time.Sleep(5 * time.Second)
}
} else {
_ = conn.Close()
time.Sleep(5 * time.Second)
}
}
}
// 安装系统服务
func (this *Node) InstallSystemService() error {
shortName := teaconst.SystemdServiceName
exe, err := os.Executable()
if err != nil {
return err
}
manager := utils.NewServiceManager(shortName, teaconst.ProductName)
err = manager.Install(exe, []string{})
if err != nil {
return err
}
return nil
}
// 处理信号 // 处理信号
func (this *Node) listenSignals() { func (this *Node) listenSignals() {
signals := make(chan os.Signal) signals := make(chan os.Signal)