mirror of https://github.com/ouqiang/gocron
refactor: 删除守护进程模块, web访问日志输出到终端, Windows不再支持后台运行
parent
d13f1997dd
commit
5d97ffad3b
2
build.sh
2
build.sh
|
@ -54,7 +54,7 @@ fi
|
||||||
|
|
||||||
echo '开始编译调度器'
|
echo '开始编译调度器'
|
||||||
if [[ $OS = 'windows' ]];then
|
if [[ $OS = 'windows' ]];then
|
||||||
GOOS=$OS GOARCH=$ARCH go build -tags gocron -ldflags '-w -H windowsgui'
|
GOOS=$OS GOARCH=$ARCH go build -tags gocron -ldflags '-w'
|
||||||
else
|
else
|
||||||
GOOS=$OS GOARCH=$ARCH go build -tags gocron -ldflags '-w'
|
GOOS=$OS GOARCH=$ARCH go build -tags gocron -ldflags '-w'
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -60,7 +60,7 @@ fi
|
||||||
|
|
||||||
echo '开始编译任务节点'
|
echo '开始编译任务节点'
|
||||||
if [[ $OS = 'windows' ]];then
|
if [[ $OS = 'windows' ]];then
|
||||||
GOOS=$OS GOARCH=$ARCH go build -tags node -ldflags '-w -H windowsgui' -o $EXEC_NAME
|
GOOS=$OS GOARCH=$ARCH go build -tags node -ldflags '-w' -o $EXEC_NAME
|
||||||
else
|
else
|
||||||
GOOS=$OS GOARCH=$ARCH go build -tags node -ldflags '-w' -o $EXEC_NAME
|
GOOS=$OS GOARCH=$ARCH go build -tags node -ldflags '-w' -o $EXEC_NAME
|
||||||
fi
|
fi
|
||||||
|
|
67
cmd/serv.go
67
cmd/serv.go
|
@ -1,67 +0,0 @@
|
||||||
package cmd
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/urfave/cli"
|
|
||||||
"fmt"
|
|
||||||
"github.com/ouqiang/gocron/modules/utils"
|
|
||||||
"github.com/ouqiang/gocron/modules/app"
|
|
||||||
"os"
|
|
||||||
"syscall"
|
|
||||||
)
|
|
||||||
|
|
||||||
var CmdServ = cli.Command{
|
|
||||||
Name: "serv",
|
|
||||||
Usage: "manage gocron, ./gocron serv -s stop|status",
|
|
||||||
Action: runServ,
|
|
||||||
Flags: []cli.Flag{
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "s",
|
|
||||||
Value:"",
|
|
||||||
Usage: "stop|status",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func runServ(ctx *cli.Context) {
|
|
||||||
if utils.IsWindows() {
|
|
||||||
fmt.Println("not support on windows")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
option := ctx.String("s")
|
|
||||||
if !utils.InStringSlice([]string{"stop", "status"}, option) {
|
|
||||||
fmt.Println("invalid option")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
app.InitEnv()
|
|
||||||
pid := app.GetPid()
|
|
||||||
if pid <= 0 {
|
|
||||||
fmt.Println("not running")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
process ,err := os.FindProcess(pid)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("not running", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
switch option {
|
|
||||||
case "stop":
|
|
||||||
stop(process)
|
|
||||||
case "status":
|
|
||||||
status(process)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func stop(process *os.Process) {
|
|
||||||
fmt.Println("stopping gocron......")
|
|
||||||
err := process.Signal(syscall.SIGTERM)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("failed to kill process", err)
|
|
||||||
} else {
|
|
||||||
fmt.Println("stopped")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
func status(process *os.Process) {
|
|
||||||
fmt.Printf("running, pid-[%d]\n", process.Pid)
|
|
||||||
}
|
|
55
cmd/web.go
55
cmd/web.go
|
@ -13,18 +13,12 @@ import (
|
||||||
"github.com/ouqiang/gocron/models"
|
"github.com/ouqiang/gocron/models"
|
||||||
"github.com/ouqiang/gocron/modules/setting"
|
"github.com/ouqiang/gocron/modules/setting"
|
||||||
"time"
|
"time"
|
||||||
"io"
|
|
||||||
"fmt"
|
|
||||||
"path/filepath"
|
|
||||||
"os/exec"
|
|
||||||
"github.com/ouqiang/gocron/modules/utils"
|
|
||||||
"github.com/ouqiang/gocron/modules/rpc/grpcpool"
|
"github.com/ouqiang/gocron/modules/rpc/grpcpool"
|
||||||
)
|
)
|
||||||
|
|
||||||
// web服务器默认端口
|
// web服务器默认端口
|
||||||
const DefaultPort = 5920
|
const DefaultPort = 5920
|
||||||
|
|
||||||
const InitProcess = 1
|
|
||||||
|
|
||||||
var CmdWeb = cli.Command{
|
var CmdWeb = cli.Command{
|
||||||
Name: "web",
|
Name: "web",
|
||||||
|
@ -54,18 +48,15 @@ var CmdWeb = cli.Command{
|
||||||
}
|
}
|
||||||
|
|
||||||
func runWeb(ctx *cli.Context) {
|
func runWeb(ctx *cli.Context) {
|
||||||
// 设置守护进程
|
|
||||||
becomeDaemon(ctx)
|
|
||||||
// 设置运行环境
|
// 设置运行环境
|
||||||
setEnvironment(ctx)
|
setEnvironment(ctx)
|
||||||
// 初始化应用
|
// 初始化应用
|
||||||
app.InitEnv()
|
app.InitEnv()
|
||||||
app.WritePid()
|
|
||||||
// 初始化模块 DB、定时任务等
|
// 初始化模块 DB、定时任务等
|
||||||
initModule()
|
initModule()
|
||||||
// 捕捉信号,配置热更新等
|
// 捕捉信号,配置热更新等
|
||||||
go catchSignal()
|
go catchSignal()
|
||||||
m := macaron.NewWithLogger(getWebLogWriter())
|
m := macaron.Classic()
|
||||||
|
|
||||||
// 注册路由
|
// 注册路由
|
||||||
routers.Register(m)
|
routers.Register(m)
|
||||||
|
@ -73,38 +64,9 @@ func runWeb(ctx *cli.Context) {
|
||||||
routers.RegisterMiddleware(m)
|
routers.RegisterMiddleware(m)
|
||||||
host := parseHost(ctx)
|
host := parseHost(ctx)
|
||||||
port := parsePort(ctx)
|
port := parsePort(ctx)
|
||||||
fmt.Println("server start")
|
|
||||||
m.Run(host, port)
|
m.Run(host, port)
|
||||||
}
|
}
|
||||||
|
|
||||||
func becomeDaemon(ctx *cli.Context) {
|
|
||||||
// 不支持windows
|
|
||||||
if utils.IsWindows() {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if !ctx.IsSet("d") {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if os.Getppid() == InitProcess {
|
|
||||||
// 子进程不再处理
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
filePath, _:= filepath.Abs(os.Args[0])
|
|
||||||
cmd := exec.Command(filePath, os.Args[1:]...)
|
|
||||||
cmd.Stdin = os.Stdin
|
|
||||||
cmd.Stdout = os.Stdout
|
|
||||||
cmd.Stderr = os.Stderr
|
|
||||||
err := cmd.Start()
|
|
||||||
if err != nil {
|
|
||||||
logger.Fatal("创建守护进程失败", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 父进程退出, 子进程由init-1号进程收养
|
|
||||||
os.Exit(0)
|
|
||||||
}
|
|
||||||
|
|
||||||
func initModule() {
|
func initModule() {
|
||||||
if !app.Installed {
|
if !app.Installed {
|
||||||
return
|
return
|
||||||
|
@ -177,25 +139,10 @@ func catchSignal() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func getWebLogWriter() io.Writer {
|
|
||||||
if macaron.Env == macaron.DEV {
|
|
||||||
return os.Stdout
|
|
||||||
}
|
|
||||||
logFile := app.LogDir + "/access.log"
|
|
||||||
var err error
|
|
||||||
w, err := os.OpenFile(logFile, os.O_RDWR|os.O_CREATE|os.O_APPEND ,0666)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Printf("日志文件[%s]打开失败", logFile)
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return w
|
|
||||||
}
|
|
||||||
|
|
||||||
// 应用退出
|
// 应用退出
|
||||||
func shutdown() {
|
func shutdown() {
|
||||||
defer func() {
|
defer func() {
|
||||||
app.RemovePid()
|
|
||||||
logger.Info("已退出")
|
logger.Info("已退出")
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}()
|
}()
|
||||||
|
|
|
@ -15,7 +15,5 @@ func main() {
|
||||||
} else {
|
} else {
|
||||||
addr = os.Args[1]
|
addr = os.Args[1]
|
||||||
}
|
}
|
||||||
for {
|
server.Start(addr)
|
||||||
server.Start(addr)
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -19,7 +19,6 @@ func main() {
|
||||||
app.Version = AppVersion
|
app.Version = AppVersion
|
||||||
app.Commands = []cli.Command{
|
app.Commands = []cli.Command{
|
||||||
cmd.CmdWeb,
|
cmd.CmdWeb,
|
||||||
cmd.CmdServ,
|
|
||||||
}
|
}
|
||||||
app.Flags = append(app.Flags, []cli.Flag{}...)
|
app.Flags = append(app.Flags, []cli.Flag{}...)
|
||||||
app.Run(os.Args)
|
app.Run(os.Args)
|
||||||
|
|
|
@ -4,11 +4,8 @@ import (
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/ouqiang/gocron/modules/logger"
|
"github.com/ouqiang/gocron/modules/logger"
|
||||||
"runtime"
|
|
||||||
"github.com/ouqiang/gocron/modules/utils"
|
"github.com/ouqiang/gocron/modules/utils"
|
||||||
"gopkg.in/ini.v1"
|
"gopkg.in/ini.v1"
|
||||||
"io/ioutil"
|
|
||||||
"strconv"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -19,12 +16,10 @@ var (
|
||||||
AppConfig string // 应用配置文件
|
AppConfig string // 应用配置文件
|
||||||
Installed bool // 应用是否安装过
|
Installed bool // 应用是否安装过
|
||||||
Setting *ini.Section // 应用配置
|
Setting *ini.Section // 应用配置
|
||||||
PidFile string
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
func InitEnv() {
|
func InitEnv() {
|
||||||
runtime.GOMAXPROCS(runtime.NumCPU())
|
|
||||||
logger.InitLogger()
|
logger.InitLogger()
|
||||||
wd, err := os.Getwd()
|
wd, err := os.Getwd()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -35,7 +30,6 @@ func InitEnv() {
|
||||||
LogDir = AppDir + "/log"
|
LogDir = AppDir + "/log"
|
||||||
DataDir = AppDir + "/data"
|
DataDir = AppDir + "/data"
|
||||||
AppConfig = ConfDir + "/app.ini"
|
AppConfig = ConfDir + "/app.ini"
|
||||||
PidFile = LogDir + "/gocron.pid"
|
|
||||||
checkDirExists(ConfDir, LogDir, DataDir)
|
checkDirExists(ConfDir, LogDir, DataDir)
|
||||||
Installed = IsInstalled()
|
Installed = IsInstalled()
|
||||||
}
|
}
|
||||||
|
@ -50,33 +44,6 @@ func IsInstalled() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func WritePid() {
|
|
||||||
pid := os.Getpid()
|
|
||||||
pidStr := strconv.Itoa(pid)
|
|
||||||
err := ioutil.WriteFile(PidFile, []byte(pidStr), 0644)
|
|
||||||
if err != nil {
|
|
||||||
logger.Fatal("写入pid文件失败", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetPid() int {
|
|
||||||
bytes, err := ioutil.ReadFile(PidFile)
|
|
||||||
if err != nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
pidStr := string(bytes)
|
|
||||||
pid, err := strconv.Atoi(pidStr)
|
|
||||||
if err != nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
return pid
|
|
||||||
}
|
|
||||||
|
|
||||||
func RemovePid() {
|
|
||||||
os.Remove(PidFile)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建安装锁文件
|
// 创建安装锁文件
|
||||||
func CreateInstallLock() error {
|
func CreateInstallLock() error {
|
||||||
_, err := os.Create(ConfDir + "/install.lock")
|
_, err := os.Create(ConfDir + "/install.lock")
|
||||||
|
|
|
@ -41,7 +41,7 @@ func Start(addr string) {
|
||||||
}
|
}
|
||||||
s := grpc.NewServer()
|
s := grpc.NewServer()
|
||||||
pb.RegisterTaskServer(s, Server{})
|
pb.RegisterTaskServer(s, Server{})
|
||||||
grpclog.Println("listen address ", addr)
|
grpclog.Println("listen ", addr)
|
||||||
err = s.Serve(l)
|
err = s.Serve(l)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
grpclog.Fatal(err)
|
grpclog.Fatal(err)
|
||||||
|
|
Loading…
Reference in New Issue