2016-12-04 6 views
0

os/execを使用してgoコードから外部アプリケーションを実行したい。アプリケーションmy_external_script.shは、stdoutにデータを2つの部分で出力します。最初の部分は非常に高速です(3秒後に "A"を書き出し、3秒後に "A"を書き出します)。例:golang os/exec:stdoutからデータを取得

./my_external_script.sh 
..... 
..... 
A (3 seconds elapsed) 
..... 
..... 
..... 
..... 
..... 
..... 
B (10 seconds elapsed) 
(program exits with 0 status code) 

私は現在、私の行くコードからそのようにこれを実行しています:

func execMyExternalCmd() (*string, error) { 
    cmd := exec.Command("my_external_script.sh") 
    var out bytes.Buffer 
    cmd.Stdout = &out 
    err := cmd.Run() 
    if err != nil { 
     return nil, err 
    } 
    var res = out.String() 
    return &res, nil 
} 

問題があり、execMyExternalCmdはわずか10秒で、両方の「A」と「B」の後に戻ります書かれており、プログラム終了しました。私はstdoutで利用可能になるとすぐに "A"を使用したいと考えています(また、後で "B"を使用することもできます)。どうすればこれを達成できますか?

答えて

0
package main 

import (
    "bufio" 
    "log" 
    "os/exec" 
) 

func main() { 
    cmd := exec.Command("sh", "-c", "echo 1;sleep 10;echo 2;") 

    outPipe, _ := cmd.StdoutPipe() 
    scanner := bufio.NewScanner(outPipe) 

    go func() { 
     for scanner.Scan() { 
      log.Println(scanner.Text()) 
     } 
    }() 

    cmd.Start() 
    cmd.Wait() 

    log.Println("Done") 
} 

出力:代わりに、リターンの関数からデータを送信するために

2016/12/04 17:11:09 1 
2016/12/04 17:11:19 2 
2016/12/04 17:11:19 Done 

使用チャンネル。

関連する問題