|
|
@ -6,6 +6,7 @@ import ( |
|
|
|
"log" |
|
|
|
"log" |
|
|
|
"io" |
|
|
|
"io" |
|
|
|
"time" |
|
|
|
"time" |
|
|
|
|
|
|
|
"math/rand" |
|
|
|
"os" |
|
|
|
"os" |
|
|
|
"errors" |
|
|
|
"errors" |
|
|
|
"sync" |
|
|
|
"sync" |
|
|
@ -16,12 +17,39 @@ func LaunchLogger(in io.Reader, out io.Writer, err error) { |
|
|
|
if err != nil { log.Fatal(err) } |
|
|
|
if err != nil { log.Fatal(err) } |
|
|
|
|
|
|
|
|
|
|
|
go func() { |
|
|
|
go func() { |
|
|
|
if _, err := io.Copy(out, in); err != nil { |
|
|
|
if _, err := io.Copy(out, in) |
|
|
|
log.Fatal(err) |
|
|
|
|
|
|
|
} |
|
|
|
err != nil { log.Printf("LOGGER: %v", err) } |
|
|
|
}() |
|
|
|
}() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func LaunchProcess(proc *config.Process, wg sync.WaitGroup) { |
|
|
|
|
|
|
|
defer wg.Done() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for { |
|
|
|
|
|
|
|
proc.ExecCmd = exec.Command(proc.Command, proc.Args...) |
|
|
|
|
|
|
|
if errors.Is(proc.ExecCmd.Err, exec.ErrDot) { |
|
|
|
|
|
|
|
proc.ExecCmd.Err = nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fmt.Println("STARTING", proc.Name) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
stderr, err := proc.ExecCmd.StderrPipe(); |
|
|
|
|
|
|
|
LaunchLogger(stderr, os.Stdout, err) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
stdout, err := proc.ExecCmd.StdoutPipe(); |
|
|
|
|
|
|
|
LaunchLogger(stdout, os.Stdout, err) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc.ExecCmd.Start() |
|
|
|
|
|
|
|
fmt.Println("WAITING for", proc.Name) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fmt.Println("SENDING READY on channel") |
|
|
|
|
|
|
|
proc.Ready<- "ready" |
|
|
|
|
|
|
|
proc.ExecCmd.Wait() |
|
|
|
|
|
|
|
fmt.Println("PROCESS", proc.Name, "EXITED") |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func main() { |
|
|
|
func main() { |
|
|
|
config.Load() |
|
|
|
config.Load() |
|
|
|
|
|
|
|
|
|
|
@ -33,34 +61,21 @@ func main() { |
|
|
|
fmt.Println("PROCESS:", name) |
|
|
|
fmt.Println("PROCESS:", name) |
|
|
|
wg.Add(1) |
|
|
|
wg.Add(1) |
|
|
|
|
|
|
|
|
|
|
|
go func() { |
|
|
|
proc.Ready = make(chan string) |
|
|
|
defer wg.Done() |
|
|
|
go LaunchProcess(&proc, wg) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
go func() { |
|
|
|
for { |
|
|
|
for { |
|
|
|
fmt.Println("STARTING", name) |
|
|
|
fmt.Println("!!!!!!!!!!!!!!!!!!!!!!!!!! killer runs") |
|
|
|
cmd := exec.Command(proc.Command, proc.Args...) |
|
|
|
is_ready := <-proc.Ready |
|
|
|
if errors.Is(cmd.Err, exec.ErrDot) { |
|
|
|
|
|
|
|
cmd.Err = nil |
|
|
|
fmt.Println("is_ready returned", is_ready) |
|
|
|
} |
|
|
|
sleep_for := rand.Int() % 10 + 1 |
|
|
|
|
|
|
|
time.Sleep(time.Duration(sleep_for) * time.Second) |
|
|
|
stderr, err := cmd.StderrPipe(); |
|
|
|
fmt.Println("!!!!!!!!!!!!!!!!!!! TIME TO DIE!!!!!") |
|
|
|
LaunchLogger(stderr, os.Stdout, err) |
|
|
|
|
|
|
|
|
|
|
|
err := proc.ExecCmd.Process.Kill() |
|
|
|
stdout, err := cmd.StdoutPipe(); |
|
|
|
if err != nil { log.Printf("killer says: %v", err) } |
|
|
|
LaunchLogger(stdout, os.Stdout, err) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cmd.Run() |
|
|
|
|
|
|
|
fmt.Println("WAITING for", name) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
go func() { |
|
|
|
|
|
|
|
fmt.Println("killer runs") |
|
|
|
|
|
|
|
time.Sleep(4 * time.Second) |
|
|
|
|
|
|
|
fmt.Println("!!!!!!!!!!!!!!!!!!! TIME TO DIE!!!!!") |
|
|
|
|
|
|
|
cmd.Process.Signal(os.Interrupt) |
|
|
|
|
|
|
|
}() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cmd.Wait() |
|
|
|
|
|
|
|
fmt.Println("PROC", name, "EXITED SEND QUIT") |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
}() |
|
|
|
}() |
|
|
|
} |
|
|
|
} |
|
|
|