diff --git a/agent.go b/agent.go index 0441652..69e0389 100644 --- a/agent.go +++ b/agent.go @@ -45,7 +45,10 @@ func deferCallback(name string, fn func()) { // RegisterService 注册系统服务 func RegisterService(app App) error { - svc := newService(app) + svc, err := newService(app) + if err != nil { + return err + } fmt.Printf("service name: %s\n", app.AgentName()) fmt.Printf("platform: %s\n", svc.Platform()) return svc.Install() @@ -53,13 +56,37 @@ func RegisterService(app App) error { // UnregisterService 卸载系统服务 func UnregisterService(app App) error { - svc := newService(app) + svc, err := newService(app) + if err != nil { + return err + } svc.Stop() return svc.Uninstall() } // Run 运行agent func Run(app App) error { - svc := newService(app) + svc, err := newService(app) + if err != nil { + return err + } return svc.Run() } + +// Start 启动agent +func Start(app App) error { + svc, err := newService(app) + if err != nil { + return err + } + return svc.Start() +} + +// Stop 停止agent +func Stop(app App) error { + svc, err := newService(app) + if err != nil { + return err + } + return svc.Stop() +} diff --git a/service.go b/service.go index d2e7016..caedbf4 100644 --- a/service.go +++ b/service.go @@ -4,6 +4,7 @@ type builtinService interface { Install() error Uninstall() error Run() error + Start() error Stop() error Platform() string } diff --git a/service_fallback.go b/service_fallback.go index 2e9d369..1531ad6 100644 --- a/service_fallback.go +++ b/service_fallback.go @@ -6,7 +6,6 @@ package agent import ( rt "runtime" - "github.com/jkstack/jkframe/utils" "github.com/lwch/service" ) @@ -14,7 +13,7 @@ type svr struct { app *app } -func newService(app App) builtinService { +func newService(app App) (builtinService, error) { var user string var depends []string if rt.GOOS != "windows" { @@ -29,9 +28,7 @@ func newService(app App) builtinService { Arguments: []string{"-conf", app.ConfDir()}, Dependencies: depends, } - svr, err := service.New(&svr{app: newApp(app)}, appCfg) - utils.Assert(err) - return svr + return service.New(&svr{app: newApp(app)}, appCfg) } func (svr *svr) Start(s service.Service) error { diff --git a/service_windows_386.go b/service_windows_386.go index d8eaa9e..b06d2bb 100644 --- a/service_windows_386.go +++ b/service_windows_386.go @@ -9,7 +9,6 @@ import ( "github.com/btcsuite/winsvc/mgr" "github.com/btcsuite/winsvc/svc" "github.com/jkstack/jkframe/logging" - "github.com/jkstack/jkframe/utils" ) type svr struct { @@ -18,14 +17,16 @@ type svr struct { exepath string } -func newService(app App) builtinService { +func newService(app App) (builtinService, error) { exepath, err := os.Executable() - utils.Assert(err) + if err != nil { + return nil, err + } return &svr{ agentName: app.AgentName(), app: newApp(app), exepath: exepath, - } + }, nil } func (svr *svr) Install() error { @@ -80,6 +81,25 @@ func (svr *svr) Run() error { return svc.Run(svr.agentName, svr) } +func (svr *svr) Start() error { + m, err := mgr.Connect() + if err != nil { + logging.Error("mgr connect: %v", err) + return err + } + defer m.Disconnect() + s, err := m.OpenService(svr.agentName) + if err != nil { + return fmt.Errorf("could not access service: %v", err) + } + defer s.Close() + err = s.Start([]string{"p1", "p2", "p3"}) + if err != nil { + return fmt.Errorf("could not start service: %v", err) + } + return nil +} + func (svr *svr) Stop() error { svr.app.stop() m, err := mgr.Connect()