mirror of
https://github.com/duanhf2012/origin.git
synced 2026-02-04 06:54:45 +08:00
优化命令行,并加入 [-help] [-start node=1] [-stop] [-config path] [-pprof 0.0.0.0:6060]参数
This commit is contained in:
@@ -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.
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
72
node/node.go
72
node/node.go
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user