6个稳定版本

使用旧的Rust 2015

1.2.5 2018年10月23日
1.2.4 2017年10月23日
1.2.1 2017年10月3日
1.0.1 2017年6月12日
1.0.0 2017年5月4日

#497 in Unix API


用于 exclave

MIT 许可证

35KB
758

Runny:进程运行器

Runny是一个Rust crate,它允许在它们的会话中轻松运行进程。您可以读取()和写入()结果运行进程,以及终止它(及其所有子进程)。

在Unix上,子进程将在其自己的pty中运行,因此它将是不缓存的。

在Windows上,系统首先发送WM_QUIT消息,这与SIGTERM的行为非常相似。如果进程没有退出,则使用TerminateProcess()作为SIGKILL的类似物。

概要

将其添加到您的Cargo.toml中

runny = "*"

然后在您的代码中创建一个Runny对象并启动子进程

let running = Runny::new("/bin/bash -c 'echo Hi there, here are some numbers:; seq 1 5;'").start().unwrap();
let exit_code = running.result();
println!("Result of command: {}", exit_code);

您还可以从输出读取并写入输入。请注意,stdout和stderr合并为“输出”

    let mut running = Runny::new("/bin/bash -c 'echo Input:; read foo; echo Got string: \
                              -$foo-; sleep 1; echo End'")
        .start()
        .unwrap();
    let mut input = running.take_input();
    let mut output = running.take_output();
    writeln!(input, "bar").unwrap();

    let mut result = String::new();
    output.read_to_string(&mut result).unwrap();

    running.terminate(None).unwrap();
    assert_eq!(result, "Input:\nGot string: -bar-\nEnd\n");

Runny命令支持设置变量,例如Timeout。如果设置了超时,则程序将在超时到期时退出,如果它尚未退出

    let timeout_secs = 3;
    let start_time = Instant::now();

    let mut running = Runny::new("/bin/bash -c 'echo -n Hi there; sleep 1000; echo -n Bye there'")
                .timeout(Duration::from_secs(timeout_secs))
                .start()
                .unwrap();

    let mut s = String::new();
    running.read_to_string(&mut s).unwrap();
    let end_time = Instant::now();

    // Give one extra second for timeout, to account for plumbing.
    assert!(end_time.duration_since(start_time) < Duration::from_secs(timeout_secs + 1));
    assert!(end_time.duration_since(start_time) > Duration::from_secs(timeout_secs - 1));
    assert_eq!(s, "Hi there");

依赖项

~2MB
~40K SLoC