Skip to content

calling create without file stdio blocks #31

Description

@tonistiigi

os/exec allows 2 ways to wait on command: Cmd.Wait() makes sure all the goroutines that can be created by Cmd.Start() are cleaned up and doesn't return before stdio is closed. Process.Wait() returns after the process has exited but leaks goroutines. Previously monitor.Wait() in this package waited only for process but was changed to fix those leaks.

Problem is that there is one command Create() that by design takes stdio, forwards it to its children and then exits itself. That means that Cmd.Wait() does not return because the attach stdio has not finished. In containerd this does not appear because the interfaces passed in are always regular files(fifos) and don't create extra goroutines in os/exec internals.

I'd recommend either changing CreateOpt to take *io.File or implementing pipe copy in this library so it can be cleaned up outside of stdlib(that would probably mean adding a cleanup function to the IO interface).

@crosbymichael

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions