优化命令行,并加入 [-help] [-start node=1] [-stop] [-config path] [-pprof 0.0.0.0:6060]参数

This commit is contained in:
boyce
2020-10-19 20:16:13 +08:00
parent c639b8df60
commit 93125e3f1c
3 changed files with 139 additions and 19 deletions

View File

@@ -75,7 +75,8 @@ cluster.json如下
* ServiceList:该Node将安装的服务列表 * ServiceList:该Node将安装的服务列表
--------------- ---------------
在启动程序命令program start nodeid=1中nodeid就是根据该配置装载服务。 在启动程序命令originserver -start nodeid=1中nodeid就是根据该配置装载服务。
更多参数使用请使用originserver -help查看。
service.json如下 service.json如下
--------------- ---------------
``` ```
@@ -267,7 +268,7 @@ func main(){
编译后运行结果如下: 编译后运行结果如下:
``` ```
#originserver start nodeid=1 #originserver -start nodeid=1
TestService1 OnInit. TestService1 OnInit.
TestService2 OnInit. TestService2 OnInit.
``` ```

View File

@@ -1,28 +1,89 @@
package console package console
import ( import (
"flag"
"fmt" "fmt"
"os"
) )
type CommandFunctionCB func(args []string)error type valueType int
type CommandFunctionCB func(args interface{}) error
var commandList []*command
const(
boolType valueType = iota
stringType valueType = iota
)
type command struct{
valType valueType
name string
bValue bool
strValue string
usage string
fn CommandFunctionCB
}
func (cmd *command) execute() error{
if cmd.valType == boolType {
return cmd.fn(cmd.bValue)
}else if cmd.valType == stringType {
return cmd.fn(cmd.strValue)
}else{
return fmt.Errorf("unknow command type!")
}
return nil
}
var mapRegisterCmd map[string]CommandFunctionCB = map[string]CommandFunctionCB{}
var programName string var programName string
func Run(args []string) error { func Run(args []string) error {
flag.Parse()
programName = args[0] programName = args[0]
if len(args) <= 1 { if flag.NFlag() <= 0 {
return fmt.Errorf("command not found, try `%s help` for help",args[0]) return fmt.Errorf("Command input parameter error,try `%s -help` for help",args[0])
} }
fn,ok := mapRegisterCmd[args[1]] var startCmd *command
if ok == false{ for _,val := range commandList {
return fmt.Errorf("command not found, try `%s help` for help",args[0]) if val.name == "start" {
startCmd = val
continue
}
err := val.execute()
if err != nil {
return err
}
} }
return fn(args) return startCmd.execute()
} }
func RegisterCommand(cmd string,fn CommandFunctionCB){ func RegisterCommandBool(cmdName string, defaultValue bool, usage string,fn CommandFunctionCB){
mapRegisterCmd[cmd] = fn var cmd command
cmd.valType = boolType
cmd.name = cmdName
cmd.fn = fn
cmd.usage = usage
flag.BoolVar(&cmd.bValue, cmdName, defaultValue, usage)
commandList = append(commandList,&cmd)
}
func RegisterCommandString(cmdName string, defaultValue string, usage string,fn CommandFunctionCB){
var cmd command
cmd.valType = stringType
cmd.name = cmdName
cmd.fn = fn
cmd.usage = usage
flag.StringVar(&cmd.strValue, cmdName, defaultValue, usage)
commandList = append(commandList,&cmd)
}
func PrintDefaults(){
fmt.Fprintf(os.Stderr, "Options:\n")
for _,val := range commandList {
fmt.Fprintf(os.Stderr, " -%-10s%10s\n",val.name,val.usage)
}
} }

View File

@@ -8,12 +8,14 @@ import (
"github.com/duanhf2012/origin/profiler" "github.com/duanhf2012/origin/profiler"
"github.com/duanhf2012/origin/service" "github.com/duanhf2012/origin/service"
"io/ioutil" "io/ioutil"
"net/http"
"os" "os"
"os/signal" "os/signal"
"strconv" "strconv"
"strings" "strings"
"syscall" "syscall"
"time" "time"
_ "net/http/pprof"
) )
var closeSig chan bool var closeSig chan bool
@@ -21,13 +23,63 @@ var sigs chan os.Signal
var nodeId int var nodeId int
var preSetupService []service.IService //预安装 var preSetupService []service.IService //预安装
var profilerInterval time.Duration var profilerInterval time.Duration
var bValid bool
func init() { func init() {
closeSig = make(chan bool,1) closeSig = make(chan bool,1)
sigs = make(chan os.Signal, 3) sigs = make(chan os.Signal, 3)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM,syscall.Signal(10)) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM,syscall.Signal(10))
console.RegisterCommandBool("help",false,"This help.",usage)
console.RegisterCommandString("start","","Run originserver.",startNode)
console.RegisterCommandBool("stop",false,"Stop originserver process",stopNode)
console.RegisterCommandString("config","","Configuration file path.",setConfigPath)
console.RegisterCommandString("pprof","","Open performance analysis.",setPprof)
} }
func usage(val interface{}) error{
ret := val.(bool)
if ret == false {
return nil
}
fmt.Fprintf(os.Stderr, `orgin version: orgin/2.10.20201019
Usage: originserver [-help] [-start node=1] [-stop] [-config path] [-pprof 0.0.0.0:6060]
`)
console.PrintDefaults()
return nil
}
func setPprof(val interface{}) error {
listenAddr := val.(string)
if listenAddr==""{
return nil
}
go func(){
err := http.ListenAndServe(listenAddr, nil)
if err != nil {
panic(fmt.Errorf("%+v",err))
}
}()
return nil
}
func setConfigPath(val interface{}) error{
configPath := val.(string)
if configPath==""{
return nil
}
_, err := os.Stat(configPath)
if err != nil {
return fmt.Errorf("Cannot find file path %s",configPath)
}
cluster.SetConfigDir(configPath)
return nil
}
func getRunProcessPid() (int,error) { func getRunProcessPid() (int,error) {
f, err := os.OpenFile(os.Args[0]+".pid", os.O_RDONLY, 0600) f, err := os.OpenFile(os.Args[0]+".pid", os.O_RDONLY, 0600)
@@ -90,8 +142,6 @@ func initNode(id int){
} }
func Start() { func Start() {
console.RegisterCommand("start",startNode)
console.RegisterCommand("stop",stopNode)
err := console.Run(os.Args) err := console.Run(os.Args)
if err!=nil { if err!=nil {
fmt.Printf("%+v\n",err) fmt.Printf("%+v\n",err)
@@ -99,20 +149,28 @@ func Start() {
} }
} }
func stopNode(args interface{}) error {
isStop := args.(bool)
if isStop == false{
return nil
}
func stopNode(args []string) error { processId,err := getRunProcessPid()
processid,err := getRunProcessPid()
if err != nil { if err != nil {
return err return err
} }
KillProcess(processid) KillProcess(processId)
return nil return nil
} }
func startNode(args []string) error { func startNode(args interface{}) error{
//1.解析参数 //1.解析参数
param := args[2] param := args.(string)
if param == "" {
return nil
}
sparam := strings.Split(param,"=") sparam := strings.Split(param,"=")
if len(sparam) != 2 { if len(sparam) != 2 {
return fmt.Errorf("invalid option %s",param) return fmt.Errorf("invalid option %s",param)