Low-level process handling

This is low-level enough that you should probably be using Shell instead to dispatch processes.

module Status : sig .. end
type t = [ `Exited of int
| `Signaled of Core.Std.Signal.t
| `Timeout of Core.Std.Time.Span.t ]
val to_string : t -> string
val sexp_of_t : t -> Sexplib.Sexp.t
module Command_result : sig .. end
type t = {
status : Status.t;
stdout_tail : string;
stderr_tail : string;
}
val kill : ?is_child:bool ->
?wait_for:Core.Std.Time.Span.t ->
?signal:Core.Std.Signal.t -> Core.Pid.t -> unit
kills a process by sending signal; waiting for wait_for and then sending a sigkill. You need to set is_child to true when killing child processes or run waitpid on them in another.
val run : ?timeout:Core.Std.Time.Span.t ->
?use_extra_path:bool ->
?working_dir:string ->
?setuid:int ->
?setgid:int ->
?env:[ `Extend of (string * string) list | `Replace of (string * string) list ] ->
?input:string ->
?keep_open:bool ->
?stdoutf:(string -> int -> unit) ->
?stderrf:(string -> int -> unit) ->
?tail_len:int -> prog:string -> args:string list -> unit -> Command_result.t