Simpler self-contained example, same result: func main() {
cmdName := "/bin/bash" cmdArgs := []string{"-c", "while true; do echo step; sleep 1; done"} cmdStdoutR, cmdStdoutW := io.Pipe() cmd := exec.Command(cmdName, cmdArgs...) cmd.Stdout = cmdStdoutW if err := cmd.Run(); err != nil { fmt.Println(err) } fmt.Println("DONE") cmdStdoutR = cmdStdoutR } For the sake of completeness I'll mention that this runs fine if cmd.Stdout is not assigned, which points to exec.awaitGoroutines() as being the culprit. FWIW, I have no direct evidence that the pipes aren't being closed on the SIGKILL. That said, the (exec-internal) goroutines are hung on io.Copy(). I expect that if the process's output pipe was actually closed the io.Copy() would return, the goroutine would complete, and the deadlock would not happen. -- Salvatore smile. On Sun, Jun 16, 2024 at 7:58 PM Salvatore Domenick Desiano < neard...@gmail.com> wrote: > I hope this isn't a red herring but in constructing a self-contained > example I triggered a deadlock. Perhaps the deadlock is the answer to my > question or perhaps it is another issue. Either way this code does not seem > malformed: > > func main() { > > cmdName := "/bin/bash" > cmdArgs := []string{ > > "-c", > > "while true; do echo step; sleep 1; done", > > } > cmdStdinR, cmdStdinW := io.Pipe() > cmdStdoutR, cmdStdoutW := io.Pipe() > cmdStderrR, cmdStderrW := io.Pipe() > ctx, cancelCmd := context.WithCancel(context.Background()) > cmd := exec.CommandContext(ctx, cmdName, cmdArgs...) > cmd.Stdin = cmdStdinR > cmd.Stdout = cmdStdoutW > cmd.Stderr = cmdStderrW > > if err := cmd.Start(); err != nil { > > fmt.Println(err) > > } > > cmdStdinW.Close() > if err := cmd.Wait(); err != nil { > > fmt.Println(err) > > } > > fmt.Println("DONE") > > cancelCmd = cancelCmd > cmdStdoutR = cmdStdoutR > cmdStderrR = cmdStderrR > > } > > If you run this code and SIGKILL the bash process, go flags it as a > deadlock and panics. FWIW, this also happens if there are goroutines > monitoring cmdStdoutR and cmdStderrR. > > What am I missing? > > -- Salvatore > smile. > > > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/CAEQs7S-Gwuvh8MJ48Nv1Cwd7miHiUX4RdwKjqmeLqMBcWYYgJQ%40mail.gmail.com.