2016-05-19 4 views
1

top -b | grep --line-buffered [some_pid] >> out.logをGoで一定期間実行してから、チャンネルから値を受け取った後にそれを強制終了する方法があるのだろうかと思います。 os.execは、コマンドで配管をサポートしていないようです。ありがとう。GO:パイプでコマンドを実行する

+1

あなたが標準出力を読み込み、別のコマンドへの入力としてそこに出力を使用することができます。 – evanmcdonnal

+0

あなたは@evanmcdonnalの言うことをしなければなりません。 'top -b'の出力を取り出し、' grep -line-buffered [pid] 'の入力として使用します。それを出力してファイルに書き出します。 – AJPennster

+2

'cmd2.Stdin、_:= cmd1.StdoutPipe()'を使ってコマンドを連鎖させ、順番に実行します。 –

答えて

0

これは私のパイピングサンプルで、OS Std Pipe経由でコールファイルbをファイルします。これを編集して、必要な処理を行うタイマーを追加することができます。

// a 
package main 

import (
    "fmt" 
    "log" 
    "os/exec" 
    "runtime" 
    "time" 
) 

var cout chan []byte = make(chan []byte) 
var cin chan []byte = make(chan []byte) 
var exit chan bool = make(chan bool) 

func Foo(x byte) byte { return call_port([]byte{1, x}) } 
func Bar(y byte) byte { return call_port([]byte{2, y}) } 
func Exit() byte  { return call_port([]byte{0, 0}) } 
func call_port(s []byte) byte { 
    cout <- s 
    s = <-cin 
    return s[1] 
} 

func start() { 
    fmt.Println("start") 
    cmd := exec.Command("../b/b") 
    stdin, err := cmd.StdinPipe() 
    if err != nil { 
     log.Fatal(err) 
    } 
    stdout, err2 := cmd.StdoutPipe() 
    if err2 != nil { 
     log.Fatal(err2) 
    } 
    if err := cmd.Start(); err != nil { 
     log.Fatal(err) 
    } 
    defer stdin.Close() 
    defer stdout.Close() 
    for { 
     select { 
     case s := <-cout: 
      stdin.Write(s) 
      buf := make([]byte, 2) 
      runtime.Gosched() 
      time.Sleep(100 * time.Millisecond) 
      stdout.Read(buf) 
      cin <- buf 
     case b := <-exit: 
      if b { 
       fmt.Printf("Exit") 
       return //os.Exit(0) 
      } 
     } 
    } 
} 
func main() { 
    go start() 
    runtime.Gosched() 
    fmt.Println("30+1=", Foo(30)) //30+1= 31 
    fmt.Println("2*40=", Bar(40)) //2*40= 80 
    Exit() 
    exit <- true 
} 

ファイルb:

// b 
package main 

import (
    "log" 
    "os" 
) 

func foo(x byte) byte { return x + 1 } 
func bar(y byte) byte { return y * 2 } 

func ReadByte() byte { 
    b1 := make([]byte, 1) 
    for { 
     n, _ := os.Stdin.Read(b1) 
     if n == 1 { 
      return b1[0] 
     } 
    } 
} 
func WriteByte(b byte) { 
    b1 := []byte{b} 
    for { 
     n, _ := os.Stdout.Write(b1) 
     if n == 1 { 
      return 
     } 
    } 
} 
func main() { 
    var res byte 
    for { 
     fn := ReadByte() 
     log.Println("fn=", fn) 
     arg := ReadByte() 
     log.Println("arg=", arg) 
     if fn == 1 { 
      res = foo(arg) 
     } else if fn == 2 { 
      res = bar(arg) 
     } else if fn == 0 { 
      return //exit 
     } else { 
      res = fn //echo 
     } 
     WriteByte(1) 
     WriteByte(res) 
    } 
} 
関連する問題