2

この質問は、2014 年 10 月現在の Rust に関するものです。

Rust 1.0 以降を使用している場合は、他の場所で解決策を探すのが最善です。


Processを使用して実行している、ログ値を生成する長時間実行される Rust プロセスがあります。

set_timeout()実行中のプロセスを定期的に「チェック」して、wait()次のような高レベルのループを実行できる可能性があります。

let mut child = match Command::new("thing").arg("...").spawn() {
    Ok(child) => child,
    Err(e) => fail!("failed to execute child: {}", e),
};
loop {
    child.set_timeout(Some(100));
    match child.wait() {
        // ??? Something goes here
    }
}

私が100%ではないことは次のとおりです。からのタイムアウトエラーとプロセスリターンエラーの違いをどのように見分けるのですか? またwait()、 を使用して、PipeStreamプッシュアウトする間隔ごとに「ストリームからブロックせずにできるだけ多くを読み取る」方法を教えてください。

これは最善のアプローチですか?代わりに stdout と stderr を監視するタスクを開始する必要がありますか?

4

2 に答える 2

5

プロセスのエラーとタイムアウトを区別するには、次の例のように、待機からの戻りを管理する必要があります。

fn run() {
    let mut child = match Command::new("sleep").arg("1").spawn() {
        Ok(child) => child,
        Err(e) => fail!("failed to execute child: {}", e),
    };
    loop {
        child.set_timeout(Some(1000));
        match child.wait() {
            // Here assume any error is timeout, you can filter from IoErrorKind
            Err(..) => println!("Timeout"),
            Ok(ExitStatus(0)) => {
                println!("Finished without errors");
                return;
            }
            Ok(ExitStatus(a)) => {
                println!("Finished with error number: {}", a);
                return;
            }
            Ok(ExitSignal(a)) => {
                println!("Terminated by signal number: {}", a);
                return;
            }
        }
    }
}

ストリームの使用については、wait_with_output で確認するか、チャネルとスレッドで同様のものを実装してください: http://doc.rust-lang.org/src/std/home/rustbuild/src/rust-buildbot/slave/nightly-linux/build /src/libstd/io/process.rs.html#601

それが役に立ったことを願っています

于 2014-10-24T19:48:46.700 に答える