1
top -b | grep --line-buffered [some_pid] >> out.log
をGoで一定期間実行してから、チャンネルから値を受け取った後にそれを強制終了する方法があるのだろうかと思います。 os.exec
は、コマンドで配管をサポートしていないようです。ありがとう。GO:パイプでコマンドを実行する
top -b | grep --line-buffered [some_pid] >> out.log
をGoで一定期間実行してから、チャンネルから値を受け取った後にそれを強制終了する方法があるのだろうかと思います。 os.exec
は、コマンドで配管をサポートしていないようです。ありがとう。GO:パイプでコマンドを実行する
これは私のパイピングサンプルで、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)
}
}
あなたが標準出力を読み込み、別のコマンドへの入力としてそこに出力を使用することができます。 – evanmcdonnal
あなたは@evanmcdonnalの言うことをしなければなりません。 'top -b'の出力を取り出し、' grep -line-buffered [pid] 'の入力として使用します。それを出力してファイルに書き出します。 – AJPennster
'cmd2.Stdin、_:= cmd1.StdoutPipe()'を使ってコマンドを連鎖させ、順番に実行します。 –