glogcenter/glc/onstart/daemon.go
2023-05-21 20:04:48 +08:00

131 lines
2.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package onstart
import (
"fmt"
"glc/conf"
"os"
"os/exec"
"os/user"
"path/filepath"
"time"
"github.com/gotoeasy/glang/cmn"
)
func init() {
// 命令行参数解析,【-d】后台方式启动【stop】停止【restart】重启【-v/version/--version/-version】查看版本
// 内部用特殊参数提示docker方式启动【--docker】固定为非后台方式
daemon := false
stop := false
restart := false
version := false
docker := false
for index, arg := range os.Args {
if index == 0 {
continue
}
if arg == "-d" {
daemon = true
}
if arg == "stop" {
stop = true
}
if arg == "restart" {
restart = true
}
if arg == "--docker" {
docker = true
}
if arg == "-v" || arg == "version" || arg == "--version" || arg == "-version" {
version = true
}
}
// 查看版本
if version {
fmt.Printf("%s\n", VERSION)
os.Exit(0)
}
// 【非容器alpine系统时结束测试用二进制部署时应注释掉
info, _ := cmn.MeasureHost()
if info == nil || !cmn.ContainsIngoreCase(info.Platform, "alpine") {
fmt.Printf("%s\n", info.Platform)
os.Exit(0)
}
// 其余参数仅支持linux
if !cmn.IsLinux() {
return
}
// 自动判断创建目录
_, err := os.Stat(conf.GetStorageRoot())
if err != nil && os.IsNotExist(err) {
os.MkdirAll(conf.GetStorageRoot(), 0766)
}
// docker方式启动
if docker {
return
}
// pid 目录、文件
pidpath := "."
pidfile := "glc.pid"
u, err := user.Current()
if err == nil {
pidpath = filepath.Join(u.HomeDir, ".glogcenter")
os.MkdirAll(pidpath, 0766)
}
pidpathfile := filepath.Join(pidpath, pidfile)
rs := checkPidFile(pidpathfile)
if rs != nil {
if stop || restart {
// 退出/重启
cmd := exec.Command("sh", "-c", "kill "+rs.Pid)
cmd.Start()
} else {
// 禁止重复启动
fmt.Printf("[PID] %s\n", rs.Pid)
os.Exit(0)
}
}
if stop {
os.Exit(0)
}
if daemon {
// cmd := exec.Command(os.Args[0], flag.Args()...)
cmd := exec.Command(os.Args[0]) // 不再需要启动参数了
err := cmd.Start()
for i := 0; i < 60; i++ {
if err != nil {
time.Sleep(time.Duration(1) * time.Second) // 原进程没退出的话会导致启动失败等待1秒后再试
} else {
break
}
}
if err != nil {
// 最多等1分钟仍旧启动失败就放弃
fmt.Printf("start %s failed, error: %v\n", os.Args[0], err)
os.Exit(1)
}
fmt.Printf("[PID] %d\n", cmd.Process.Pid)
os.Exit(0)
} else {
npid := fmt.Sprintf("%d", os.Getpid())
nerr := savePid(pidpathfile, npid)
if nerr != nil {
cmd := exec.Command("sh", "-c", "kill "+npid)
cmd.Start()
os.Exit(1)
}
}
}