PackageTrack
Sign in Get early access

duct

a library for running child processes

1.1.1 36M downloads/mo #1498 most downloaded on crates.io oconnor663/duct.rs

What this package is like to depend on

Last release 9 months ago

09 Nov 2025

Release timing varies

gaps range from 3 weeks to 1.8 years

Some releases are documented

notes for 10 of 28 stable releases

Nothing withdrawn

no release was ever pulled

11 years old

28 releases · first in 2016

1 release in the last 12 months

see the full history below

Release timeline

28 releases · Feb 2016 to Nov 2025
2017 2018 2019 2020 2021 2022 2023 2024 2025 2026
Release Pre-release

Releases

latest 28
  1. 1.1.1 09 Nov 2025
    Release notes

    Changes since 1.1.0:

    • Duct now uses a global Mutex to prevent pipe inheritance bugs caused
      by the lack of pipe2 on macOS. (The Python version of Duct relies on
      close_fds=True instead, but the Rust standard library has no
      equivalent.)
    Open source →
  2. 1.1.0 03 Aug 2025
    Release notes

    Changes since 1.0.0:

    • Added the Handle::wait_timeout and Handle::wait_deadline methods.
      These are gated by the timeout feature, which is enabled by default.
      Windows supports these timeouts natively, but on Unix this requires
      handling SIGCHLD.
    • Fixed a bug with setting or removing non-uppercase env var names on
      Windows. Duct previously uppercased all env var names passed to its
      API, but not names coming from the system environment, which caused
      mismatches. See #119.
      Contributed by @Wazzaps.
    Open source →
  3. 1.0.0 07 May 2025
    Release notes

    Changes since 0.13.7:

    • The API is stabilized as-is, and most callers won't need to make any
      changes.
    • Fixed a bug where Handle::try_wait could block indefinitely if a
      child process had exited but a longer-lived grandchild process was
      keeping its IO pipes open and its IO threads running (i.e.
      stdin_bytes, stdout_capture, or stderr_capture). Commit 04c2c8c.
    • Handle now does lazy cleanup of leaked zombie children. If a child
      has not exited by the time its Handle is dropped, that child gets
      added to a global list. Whenever any Duct function is about to spawn a
      new child, it polls each child in the leaked list and cleans up any
      that have exited. This strategy is copied from Python's subprocess
      module. ReaderHandle contains a Handle internally and does the
      same cleanup.
    • With that new cleanup mechanism in place, Handle::kill and
      ReaderHandle::kill no longer wait on child processes to exit. This
      avoids obscure edge cases (FUSE filesystems, debugger pauses) where
      waiting after SIGKILL could still block indefinitely.
    • Duct no longer kills your child processes in any circumstance other
      than when you call .kill(). Previously Duct would kill child
      processes when dropping a ReaderHandle, or in rare pipe spawning
      error cases.
    Open source →
  4. 0.13.7 22 Dec 2023
    Release notes

    Changes since 0.13.6:

    • Avoid unnecessarily dup'ing standard file descriptors. This unbreaks
      some use cases where those descriptors might not exist at all, like
      Windows services. See #99.
    Open source →
  5. 0.13.6 29 Nov 2022
    Release notes

    Changes since 0.13.5:

    • Dependency updates only.
    Open source →
  6. 0.13.5 04 Feb 2021
    Release notes

    Changes since 0.13.4:

    • Doc changes only.
    Open source →
  7. 0.13.4 13 Apr 2020
    Release notes

    Changes since 0.13.3:

    • The duct_sh crate is now versioned in lockstep with duct.
    • Doc changes.
    Open source →
  8. 0.13.3 30 Oct 2019
    Release notes

    Changes since 0.13.2:

    • Added Handle::pids and ReaderHandle::pids.
    Open source →
  9. 0.13.2 15 Oct 2019
    Release notes

    Changes since 0.13.1:

    • Added ReaderHandle::try_wait.
    • Debug output for Expression is more concise.
    Open source →
  10. 0.13.1 12 Oct 2019
    Release notes

    Changes since 0.13.0:

    • ReaderHandle now supports kill().
    • Kill methods no longer wait on IO threads to complete. This avoids
      blocking on unkilled grandchildren.
    Open source →
  11. 0.13.0 22 Sep 2019

    Nothing published for this version

  12. 0.12.0 15 Feb 2019

    Nothing published for this version

  13. 0.11.1 20 Sep 2018

    Nothing published for this version

  14. 0.11.0 05 Jul 2018

    Nothing published for this version

  15. 0.10.0 12 Feb 2018

    Nothing published for this version

  16. 0.9.2 16 Oct 2017

    Nothing published for this version

  17. 0.9.1 05 Jun 2017

    Nothing published for this version

  18. 0.9.0 30 May 2017

    Nothing published for this version

  19. 0.8.2 27 Mar 2017

    Nothing published for this version

  20. 0.8.1 24 Mar 2017

    Nothing published for this version

  21. 0.8.0 23 Mar 2017

    Nothing published for this version

  22. 0.7.0 06 Feb 2017

    Nothing published for this version

  23. 0.6.0 26 Jan 2017

    Nothing published for this version

  24. 0.5.1 29 Dec 2016

    Nothing published for this version

  25. 0.5.0 24 Dec 2016

    Nothing published for this version

  26. 0.4.0 26 Jun 2016

    Nothing published for this version

  27. 0.2.0 26 Apr 2016

    Nothing published for this version

  28. 0.1.0 20 Feb 2016

    Nothing published for this version

Every package, every release, already written down.

The archive is open and free. Watching your own project is what we are building next.

Browse the archive