func main() {
fmt.Fprintln(os.Stdout, "Child started.")
time.Sleep(time.Second * 1)
fmt.Println("Tick...")
time.Sleep(time.Second * 1)
fmt.Println("Tick...")
time.Sleep(time.Second * 1)
fmt.Println("Tick...")
time.Sleep(time.Second * 2)
fmt.Println("Child ended.")
}
func main() {
fmt.Fprintln(os.Stdout, "Child started.")
time.Sleep(time.Second * 1)
fmt.Fprintln(os.Stdout, "Tick...")
time.Sleep(time.Second * 1)
fmt.Fprintln(os.Stdout, "Tick...")
time.Sleep(time.Second * 1)
fmt.Fprintln(os.Stdout, "Tick...")
time.Sleep(time.Second * 2)
panic("testing")
fmt.Fprintln(os.Stdout, "Child ended.")
}
func executeCommand(output chan<- string, err chan<- error, start chan interface{}, cmd *exec.Cmd) {
defer close(start)
stdout, e := cmd.StdoutPipe()
if e != nil {
log.Println("Error starting Cmd: ", e)
err <- e
return
}
cmd.Stderr = cmd.Stdout
<-start
scanner := bufio.NewScanner(stdout)
for scanner.Scan() {
output <- scanner.Text()
}
}
func run(cmd *exec.Cmd) {
start := make(chan interface{})
output := make(chan string)
errChan := make(chan error)
defer close(output)
defer close(errChan)
go executeCommand(output, errChan, start, cmd)
start <- nil
if e := cmd.Start(); e != nil {
log.Println("Error starting Cmd: ", e)
}
for {
select {
case b := <-output:
fmt.Println(b)
case e := <-errChan:
fmt.Println("ERR EXECUTING COMMAND->", e)
return
case <-start:
fmt.Println("COMPLETED")
return
}
}
}
使用child或childerr创建示例长时间运行的进程。