11use std:: io:: { BufRead , BufReader } ;
2- use serde:: { Deserialize , Serialize } ;
32use tokio:: sync:: broadcast;
43use tracing:: { info} ;
54use crate :: connection:: Connection ;
6- use std:: process:: Command ;
7-
8-
9- #[ derive( Serialize , Deserialize , Debug , Clone ) ]
10- #[ serde( tag = "type" ) ]
11- pub enum RequestMessage {
12- Cmd {
13- command : String ,
14- request_id : String ,
15- }
16- }
17-
18- #[ derive( Serialize , Deserialize , Debug , Clone ) ]
19- #[ serde( tag = "type" ) ]
20- pub enum ResponseMessage {
21- Ok { request_id : String , seq : u32 , data : String , pid : u32 } ,
22- Err { request_id : String , message : String }
23- }
5+ use std:: process:: { Command , Stdio } ;
6+ use crate :: message:: { RequestMessage , ResponseMessage } ;
247
258
269type Receiver = broadcast:: Receiver < ( String , RequestMessage ) > ;
@@ -44,7 +27,9 @@ impl Handler {
4427 match cmd {
4528 RequestMessage :: Cmd { command, request_id } => {
4629 let mut seq: u32 = 1 ;
47- match Command :: new ( & command) . spawn ( ) {
30+ let mut command = Command :: new ( & command) ;
31+ command. stdout ( Stdio :: piped ( ) ) . stderr ( Stdio :: piped ( ) ) ;
32+ match command. spawn ( ) {
4833 Ok ( mut child) => {
4934 let pid = child. id ( ) ;
5035 if let Some ( stdout) = child. stdout . take ( ) {
@@ -70,7 +55,7 @@ impl Handler {
7055#[ cfg( test) ]
7156mod test {
7257 use std:: io:: { BufRead , BufReader } ;
73- use std:: process:: Command ;
58+ use std:: process:: { Command , Stdio } ;
7459 use std:: time:: Duration ;
7560
7661 use super :: RequestMessage ;
@@ -85,15 +70,19 @@ mod test {
8570
8671 #[ test]
8772 pub fn parse ( ) {
88- let mut child = Command :: new ( "top" )
73+ let mut cmd = Command :: new ( "ls" ) ;
74+ cmd. stdout ( Stdio :: piped ( ) ) . stderr ( Stdio :: piped ( ) ) ;
75+ let mut child = cmd
8976 . spawn ( ) . unwrap ( ) ;
77+
78+
9079 if let Some ( stdout) = child. stdout . take ( ) {
9180 let reader = BufReader :: new ( stdout) ;
9281 reader. lines ( ) . filter_map ( |line| line. ok ( ) ) . for_each ( |line| println ! ( "{}" , line) ) ;
9382 }
9483
9584 println ! ( "pid:{}" , child. id( ) ) ;
96- std:: thread:: sleep ( Duration :: from_secs ( 10 ) ) ;
85+ // std::thread::sleep(Duration::from_secs(10));
9786 child. kill ( ) . unwrap ( )
9887
9988 }
0 commit comments