mirror of
https://github.com/openziti/zrok.git
synced 2024-12-23 23:29:22 +01:00
60 lines
967 B
Go
60 lines
967 B
Go
//go:build !windows
|
|
|
|
package proctree
|
|
|
|
import (
|
|
"os/exec"
|
|
"sync"
|
|
)
|
|
|
|
func Init(_ string) error {
|
|
return nil
|
|
}
|
|
|
|
func StartChild(tail TailFunction, args ...string) (*Child, error) {
|
|
cmd := exec.Command(args[0], args[1:]...)
|
|
|
|
cld := &Child{
|
|
TailFunction: tail,
|
|
cmd: cmd,
|
|
outStream: make(chan []byte),
|
|
errStream: make(chan []byte),
|
|
wg: new(sync.WaitGroup),
|
|
}
|
|
|
|
stdout, err := cmd.StdoutPipe()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
stderr, err := cmd.StderrPipe()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err := cmd.Start(); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
cld.wg.Add(3)
|
|
go reader(stdout, cld.outStream, cld.wg)
|
|
go reader(stderr, cld.errStream, cld.wg)
|
|
go cld.combiner(cld.wg)
|
|
|
|
return cld, nil
|
|
}
|
|
|
|
func WaitChild(c *Child) error {
|
|
c.wg.Wait()
|
|
if err := c.cmd.Wait(); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func StopChild(c *Child) error {
|
|
if err := c.cmd.Process.Kill(); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|