quit when child plugin quits

This commit is contained in:
Boshi Lian 2022-10-25 09:24:25 +00:00
parent 4ebef96a50
commit 630a01fbb6
2 changed files with 46 additions and 28 deletions

View file

@ -502,6 +502,7 @@ func (g *GrpcPlugin) RecvLogs(writer io.Writer) error {
type CmdPlugin struct {
GrpcPlugin
Quit <-chan error
}
func DialCmd(cmd *exec.Cmd) (*CmdPlugin, error) {
@ -514,11 +515,9 @@ func DialCmd(cmd *exec.Cmd) (*CmdPlugin, error) {
_, _ = io.Copy(log.StandardLogger().Out, stderr)
}()
ch := make(chan error, 1)
go func() {
err := cmd.Wait()
if err != nil {
log.Errorf("cmd %v error: %v", cmd.Path, err)
}
ch <- cmd.Wait()
}()
conn, err := grpc.Dial("", grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithContextDialer(func(_ context.Context, _ string) (net.Conn, error) {
@ -535,5 +534,5 @@ func DialCmd(cmd *exec.Cmd) (*CmdPlugin, error) {
return nil, err
}
return &CmdPlugin{*g}, nil
return &CmdPlugin{*g, ch}, nil
}

View file

@ -48,30 +48,23 @@ func splitByDash(args []string) ([]string, []string) {
return args, nil
}
func createPlugin(args []string) (*plugin.GrpcPlugin, error) {
func createCmdPlugin(args []string) (*plugin.CmdPlugin, error) {
exe := args[0]
switch exe {
case "grpc":
log.Info("starting net grpc plugin: ")
return createNetGrpcPlugin(args)
cmd := exec.Command(exe)
cmd.Args = args
setPdeathsig(cmd)
default:
cmd := exec.Command(exe)
cmd.Args = args
setPdeathsig(cmd)
log.Info("starting child process plugin: ", cmd.Args)
log.Info("starting child process plugin: ", cmd.Args)
p, err := plugin.DialCmd(cmd)
if err != nil {
return nil, err
}
p.Name = exe
return &p.GrpcPlugin, nil
p, err := plugin.DialCmd(cmd)
if err != nil {
return nil, err
}
p.Name = exe
return p, nil
}
func main() {
@ -138,6 +131,7 @@ func main() {
return err
}
quit := make(chan error)
d.lis = &proxyproto.Listener{Listener: d.lis}
var plugins []*plugin.GrpcPlugin
@ -156,9 +150,30 @@ func main() {
continue
}
p, err := createPlugin(args)
if err != nil {
return err
var p *plugin.GrpcPlugin
switch args[0] {
case "grpc":
log.Info("starting net grpc plugin: ")
grpcplugin, err := createNetGrpcPlugin(args)
if err != nil {
return err
}
p = grpcplugin
default:
cmdplugin, err := createCmdPlugin(args)
if err != nil {
return err
}
go func() {
quit <- <-cmdplugin.Quit
}()
p = &cmdplugin.GrpcPlugin
}
go func() {
@ -175,7 +190,11 @@ func main() {
d.recorddir = ctx.String("typescript-log-dir")
return d.run()
go func() {
quit <- d.run()
}()
return <-quit
},
}