2014-10-24 5 views
1

Этот вопрос относится к Rust по состоянию на октябрь 2014 года.Как вы могли бы вывести поток из процесса в ржавчине?

Если вы используете Rust 1.0 или выше, лучше всего искать решение в другом месте.


У меня долго работает процесс Rust, который генерирует значение журналов, которые я бег с помощью Process.

Он смотрит, что я мог бы периодически «проверить» запущенного процесса с использованием 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?

+3

редактирования вы сделали слишком резкое - это аннулировал существующий ответ. Я откатил редактирование и возвратил вашу награду. Задайте новый вопрос. Если вам не нужен этот вопрос на сайте, вы можете удалить его, поскольку он имеет только один ответ без каких-либо изменений. – ChrisF

+0

@ChrisF вы должны шутить. – Doug

+4

Нет, я не шучу. Редактирование было полным переписанием вопроса. Было бы лучше задать совершенно новый вопрос. – ChrisF

ответ

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

Надеется, что это помогло

+0

Это свойство wait() находится на месте, но wait_with_output читает весь результат, прежде чем он вернет что-либо, что именно то, что я не может сделать в этом случае (и он * реализован с использованием канала ...) – Doug

+0

Вы можете изменить вызов 'read_to_end'' 'read (length)' или более убедительный, который вы нашли. – snf

Смежные вопросы