diff --git a/client/service.go b/client/service.go index 5fbf33c7..e2c65e65 100644 --- a/client/service.go +++ b/client/service.go @@ -36,7 +36,7 @@ func NewService(pxyCfgs map[string]config.ProxyConf, visitorCfgs map[string]conf return } -func (svr *Service) Run() error { +func (svr *Service) Run(cmd bool) error { err := svr.ctl.Run() if err != nil { return err @@ -50,7 +50,13 @@ func (svr *Service) Run() error { log.Info("admin server listen on %s:%d", g.GlbClientCfg.AdminAddr, g.GlbClientCfg.AdminPort) } - <-svr.closedCh + if cmd { + <-svr.closedCh + } else { + go func() { + <-svr.closedCh + }() + } return nil } diff --git a/cmd/frpc/sub/root.go b/cmd/frpc/sub/root.go index 676f6206..459480cd 100644 --- a/cmd/frpc/sub/root.go +++ b/cmd/frpc/sub/root.go @@ -95,13 +95,20 @@ var rootCmd = &cobra.Command{ }, } +// if cmd model +var cmd bool + +var service *client.Service + func Execute() { + cmd = true if err := rootCmd.Execute(); err != nil { os.Exit(1) } } func RunFrpc(cfgFilePath string) (err error) { + cmd = false return runClient(cfgFilePath) } @@ -208,12 +215,23 @@ func startService(pxyCfgs map[string]config.ProxyConf, visitorCfgs map[string]co } } svr := client.NewService(pxyCfgs, visitorCfgs) + service = svr // Capture the exit signal if we use kcp. if g.GlbClientCfg.Protocol == "kcp" { go handleSignal(svr) } - err = svr.Run() + err = svr.Run(cmd) + return +} + +func StopFrp() (err error) { + if service == nil { + return fmt.Errorf("frp not start") + } + + service.Close() + log.Info("frpc is stoped") return }