pub struct SpawnedProcess { /* private fields */ }Expand description
Handle to one or more spawned subprocesses (a single command or a pipeline).
Lifecycle methods (wait, kill,
try_wait, wait_timeout) take
&self so the handle can be shared across threads. Stdio accessors
(take_stdin, take_stdout)
are one-shot — the second call returns None.
For pipelines, take_stdin targets the leftmost stage, take_stdout the
rightmost, and wait/kill operate on every stage. Exit status follows
pipefail semantics: rightmost non-success wins.
§Wait idempotency
wait, try_wait, and
wait_timeout are all idempotent. The first
finalize captures stdout, stderr, and per-stage exit statuses into an
internal Arc; subsequent calls reconstruct the same
Result<RunOutput, RunError> from that cache. This matters for:
tokio::select!-style cancellation where a pendingwaitfuture is dropped and a secondwaitis issued afterkill.- Retry loops over a spawned handle.
- Concurrent
waitcalls from multiple threads — internal serialization ensures both see the same outcome, not split-brain partial state.
Cost of the second call: one Vec<u8> clone and one String clone per
invocation (the cached raw bytes are copied into a fresh RunOutput).
For multi-gigabyte outputs this is not free, but the common cases
(accidental double-call, cancellation pattern) are cheap.
§Dropping without waiting
Dropping a SpawnedProcess without calling wait leaves
the child(ren) to be reaped by the OS; a valid pattern for
fire-and-forget jobs but may leave short-lived zombies until parent
exit on Unix.
Implementations§
Source§impl SpawnedProcess
impl SpawnedProcess
Sourcepub fn command(&self) -> &CmdDisplay
pub fn command(&self) -> &CmdDisplay
Snapshot of the command used to spawn (shell-quoted, secret-redacted).
Sourcepub fn is_pipeline(&self) -> bool
pub fn is_pipeline(&self) -> bool
Whether this handle represents a multi-stage pipeline.
Sourcepub fn take_stdin(&self) -> Option<ChildStdin>
pub fn take_stdin(&self) -> Option<ChildStdin>
Take ownership of the leftmost child’s stdin. Returns None after the
first call or if stdin wasn’t piped. Drop the returned ChildStdin to
send EOF.
Sourcepub fn take_stdout(&self) -> Option<ChildStdout>
pub fn take_stdout(&self) -> Option<ChildStdout>
Take ownership of the rightmost child’s stdout. Returns None after
the first call or once the Read impl has consumed stdout.
Sourcepub fn kill(&self) -> Result<(), Error>
pub fn kill(&self) -> Result<(), Error>
Send SIGKILL (Unix) or TerminateProcess (Windows) to every stage.
Returns the first error encountered, if any; still attempts all.
Sourcepub fn try_wait(&self) -> Result<Option<RunOutput>, RunError>
pub fn try_wait(&self) -> Result<Option<RunOutput>, RunError>
Non-blocking status check. Ok(None) means at least one stage is
still running; only returns Ok(Some(_)) when every stage has
exited. Idempotent — after the first Ok(Some(_)), subsequent
calls return the same cached outcome.
Trait Implementations§
Source§impl Debug for SpawnedProcess
impl Debug for SpawnedProcess
Source§impl Read for &SpawnedProcess
impl Read for &SpawnedProcess
Source§fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error>
fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error>
1.36.0 · Source§fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
read, except that it reads into a slice of buffers. Read moreSource§fn is_read_vectored(&self) -> bool
fn is_read_vectored(&self) -> bool
can_vector)1.0.0 · Source§fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>
buf. Read more1.0.0 · Source§fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
buf. Read more1.6.0 · Source§fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
buf. Read moreSource§fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
read_buf)Source§fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
read_buf)cursor. Read more1.0.0 · Source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Read. Read more1.0.0 · Source§fn chain<R>(self, next: R) -> Chain<Self, R>
fn chain<R>(self, next: R) -> Chain<Self, R>
Source§impl Read for SpawnedProcess
Read directly from the rightmost stage’s stdout.
impl Read for SpawnedProcess
Read directly from the rightmost stage’s stdout.
On first read, takes ownership of stdout internally (so subsequent
take_stdout calls return None).
Reads return Ok(0) when stdout closes (EOF). Call
wait after EOF to surface the exit status.
Source§fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error>
fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error>
1.36.0 · Source§fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
read, except that it reads into a slice of buffers. Read moreSource§fn is_read_vectored(&self) -> bool
fn is_read_vectored(&self) -> bool
can_vector)1.0.0 · Source§fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>
buf. Read more1.0.0 · Source§fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
buf. Read more1.6.0 · Source§fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
buf. Read moreSource§fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
read_buf)Source§fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
read_buf)cursor. Read more1.0.0 · Source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Read. Read more