Example #1
0
func runProgram(p *program.Program, stopChan chan struct{}) {
	cmd, err := p.GetCmd()
	if err != nil {
		return
	}
	fmt.Printf("Name: %s, Config: %+v\n", p.Name, cmd)
	err = cmd.Start()
	if err != nil {
		return
	}
	done := make(chan error, 1)
	go func() {
		done <- cmd.Wait()
	}()
	select {
	case <-stopChan:
		if err := cmd.Process.Kill(); err != nil {
			log.Fatal("failed to kill: ", err)
		}
		<-done // allow goroutine to exit
		log.Println("process killed")
	case err := <-done:
		if err != nil {
			log.Printf("process done with error = %v", err)
		}
	}
}