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.

Reply via email to