It hangs because cmd.Run() waits for the process to complete - and with nothing reading the pipe it will never complete. On Jun 16, 2024, at 9:33 PM, Robert Engels <reng...@ix.netcom.com> wrote:
It looks like you don’t have anything reading from the pipe so it’s going to hang. On Jun 16, 2024, at 8:54 PM, Salvatore Domenick Desiano <neard...@gmail.com> wrote:
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.
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.
--
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/BB6ADA54-22F5-44AC-AB9B-149308C5FA56%40ix.netcom.com.
|