diff --git a/main/commands/run.go b/main/commands/run.go index 328aff010..b948b9f74 100644 --- a/main/commands/run.go +++ b/main/commands/run.go @@ -3,14 +3,9 @@ package commands import ( "fmt" "log" - "net/http" - _ "net/http/pprof" "os" - "os/signal" "path/filepath" - "runtime" "strings" - "syscall" core "github.com/v2fly/v2ray-core/v5" "github.com/v2fly/v2ray-core/v5/common/cmdarg" @@ -18,59 +13,16 @@ import ( "github.com/v2fly/v2ray-core/v5/main/commands/base" ) -// CmdRun runs V2Ray with config -var CmdRun = &base.Command{ - CustomFlags: true, - UsageLine: "{{.Exec}} run [-c config.json] [-d dir]", - Short: "run V2Ray with config", - Long: ` -Run V2Ray with config. - -{{.Exec}} will also use the config directory specified by environment -variable "v2ray.location.confdir". If no config found, it tries -to load config from one of below: - - 1. The default "config.json" in the current directory - 2. The config file from ENV "v2ray.location.config" - 3. The stdin if all failed above - -Arguments: - - -c, -config - Config file for V2Ray. Multiple assign is accepted. - - -d, -confdir - A directory with config files. Multiple assign is accepted. - - -r - Load confdir recursively. - - -format - Format of config input. (default "auto") - -Examples: - - {{.Exec}} {{.LongName}} -c config.json - {{.Exec}} {{.LongName}} -d path/to/dir - -Use "{{.Exec}} help format-loader" for more information about format. - `, - Run: executeRun, -} - var ( configFiles cmdarg.Arg configDirs cmdarg.Arg configFormat *string configDirRecursively *bool - - configPprof *string ) func setConfigFlags(cmd *base.Command) { configFormat = cmd.Flag.String("format", core.FormatAuto, "") configDirRecursively = cmd.Flag.Bool("r", false, "") - configPprof = cmd.Flag.String("pprof", "", "") cmd.Flag.Var(&configFiles, "config", "") cmd.Flag.Var(&configFiles, "c", "") @@ -78,39 +30,6 @@ func setConfigFlags(cmd *base.Command) { cmd.Flag.Var(&configDirs, "d", "") } -func executeRun(cmd *base.Command, args []string) { - setConfigFlags(cmd) - cmd.Flag.Parse(args) - printVersion() - configFiles = getConfigFilePath() - server, err := startV2Ray() - if err != nil { - base.Fatalf("Failed to start: %s", err) - } - - if addr := *configPprof; addr != "" { - go func() { - if err := http.ListenAndServe(addr, nil); err != nil { - log.Print(err) - } - }() - } - - if err := server.Start(); err != nil { - base.Fatalf("Failed to start: %s", err) - } - defer server.Close() - - // Explicitly triggering GC to remove garbage from config loading. - runtime.GC() - - { - osSignals := make(chan os.Signal, 1) - signal.Notify(osSignals, os.Interrupt, syscall.SIGTERM) - <-osSignals - } -} - func fileExists(file string) bool { info, err := os.Stat(file) return err == nil && !info.IsDir() diff --git a/main/commands/run_default.go b/main/commands/run_default.go new file mode 100644 index 000000000..3a44b23c8 --- /dev/null +++ b/main/commands/run_default.go @@ -0,0 +1,78 @@ +//go:build !pprof +// +build !pprof + +package commands + +import ( + "os" + "os/signal" + "runtime" + "syscall" + + "github.com/v2fly/v2ray-core/v5/main/commands/base" +) + +// CmdRun runs V2Ray with config +var CmdRun = &base.Command{ + CustomFlags: true, + UsageLine: "{{.Exec}} run [-c config.json] [-d dir]", + Short: "run V2Ray with config", + Long: ` +Run V2Ray with config. + +{{.Exec}} will also use the config directory specified by environment +variable "v2ray.location.confdir". If no config found, it tries +to load config from one of below: + + 1. The default "config.json" in the current directory + 2. The config file from ENV "v2ray.location.config" + 3. The stdin if all failed above + +Arguments: + + -c, -config + Config file for V2Ray. Multiple assign is accepted. + + -d, -confdir + A directory with config files. Multiple assign is accepted. + + -r + Load confdir recursively. + + -format + Format of config input. (default "auto") + +Examples: + + {{.Exec}} {{.LongName}} -c config.json + {{.Exec}} {{.LongName}} -d path/to/dir + +Use "{{.Exec}} help format-loader" for more information about format. + `, + Run: executeRun, +} + +func executeRun(cmd *base.Command, args []string) { + setConfigFlags(cmd) + cmd.Flag.Parse(args) + printVersion() + configFiles = getConfigFilePath() + server, err := startV2Ray() + if err != nil { + base.Fatalf("Failed to start: %s", err) + } + + if err := server.Start(); err != nil { + base.Fatalf("Failed to start: %s", err) + } + defer server.Close() + + // Explicitly triggering GC to remove garbage from config loading. + runtime.GC() + + { + osSignals := make(chan os.Signal, 1) + signal.Notify(osSignals, os.Interrupt, syscall.SIGTERM) + <-osSignals + } +} diff --git a/main/commands/run_pprof.go b/main/commands/run_pprof.go new file mode 100644 index 000000000..201a459a2 --- /dev/null +++ b/main/commands/run_pprof.go @@ -0,0 +1,93 @@ +//go:build pprof +// +build pprof + +package commands + +import ( + "log" + "net/http" + _ "net/http/pprof" + "os" + "os/signal" + "runtime" + "syscall" + + "github.com/v2fly/v2ray-core/v5/main/commands/base" +) + +// CmdRun runs V2Ray with config +var CmdRun = &base.Command{ + CustomFlags: true, + UsageLine: "{{.Exec}} run [-c config.json] [-d dir] [-pprof port]", + Short: "run V2Ray with config", + Long: ` +Run V2Ray with config. + +{{.Exec}} will also use the config directory specified by environment +variable "v2ray.location.confdir". If no config found, it tries +to load config from one of below: + + 1. The default "config.json" in the current directory + 2. The config file from ENV "v2ray.location.config" + 3. The stdin if all failed above + +Arguments: + + -c, -config + Config file for V2Ray. Multiple assign is accepted. + + -d, -confdir + A directory with config files. Multiple assign is accepted. + + -r + Load confdir recursively. + + -format + Format of config input. (default "auto") + + -pprof + HTTP server port for pprof debugging. (default "8080") + +Examples: + + {{.Exec}} {{.LongName}} -c config.json + {{.Exec}} {{.LongName}} -d path/to/dir + +Use "{{.Exec}} help format-loader" for more information about format. + `, + Run: executeRun, +} + +func executeRun(cmd *base.Command, args []string) { + setConfigFlags(cmd) + pprof := cmd.Flag.String("pprof", ":8080", "") + cmd.Flag.Parse(args) + printVersion() + configFiles = getConfigFilePath() + server, err := startV2Ray() + if err != nil { + base.Fatalf("Failed to start: %s", err) + } + + if addr := *pprof; addr != "" { + go func() { + if err := http.ListenAndServe(addr, nil); err != nil { + log.Print(err) + } + }() + } + + if err := server.Start(); err != nil { + base.Fatalf("Failed to start: %s", err) + } + defer server.Close() + + // Explicitly triggering GC to remove garbage from config loading. + runtime.GC() + + { + osSignals := make(chan os.Signal, 1) + signal.Notify(osSignals, os.Interrupt, syscall.SIGTERM) + <-osSignals + } +}