2016-05-22 5 views
2

psコマンドをゴルーチンで連続的に起動して、memとcpuの使用状況を監視したいとします。 topを使用しませんでした。topで列を選択できないため、psがあります。このゴルーチンは、commandを停止させるために停止信号を受け取る必要がありますが、信号を待っている間にコマンドを実行するのをどのようにブロックするかわかりません。 topのために私が行うことができます。Go:ブロック動作を実行していない間の信号に作用する

top := exec.Command("top") 
<-stop // blocking 
top.Process.Signal(os.Kill) 

しかし、私がしなければpsのために:

ps := exec.Command("ps") 
for { 
    ps.Run() 
    <-stop 
} 

上記のコードはstop上でブロックされます。私は、停止信号が準備ができているときに停止することができる一方、発砲を続けることを望む。ps.Run()。ありがとう。

答えて

1

これを達成できる方法の1つは、for/selectタイムアウトイディオムを利用することです。これを行うには、いくつかの同様の方法があります。この些細な例を見てみましょう:いいえ、他の場合ならば

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 
    abort := make(chan struct{}) 

    go func() { 
     for { 
      select { 
      case <-abort: 
       return 
      case <-time.After(1 * time.Second): 
       // replace fmt.Println() with the command you wish to run 
       fmt.Println("tick") 
      } 
     } 
    }() 
    // replace time.Sleep() with code waiting for 'abort' command input 
    time.Sleep(10 * time.Second) 
    abort <- struct{}{} 
} 

は、お使いの環境の場所で使用すると、1秒に1回実行されます(この例では)<-time.After():場合に実行したいコードを動作するように、この例を変更するにはその期間受信することができます。最後に配置したtime.Sleep()の代わりに、<-time.After():ケースを中断するコードを入れてabortチャンネル(または名前を付けて)に<- struct{}{}を送信します。

注:私は<-abort trueの明瞭さを好むとchan struct{}は明らかなようであることを考慮していないとして、この答えの以前のバージョンでは、私は、chan boolとして中止していた、私は<- struct{}{}として、しかし、この例ではそれを変更することにしました特にあなたがパターンに慣れてしまったら、不明瞭ではありません。また

、次のコマンドは、forループの各反復で実行し、タイムアウトを待たず、あなたはその場合default:作ることができ、を削除すると、別のチャンネルがある場合には、ループの各反復で実行する場合受け取る準備ができていません。

playgroundでこの例を試すことはできますが、syscallsを許可しない場合や、その環境でdefault:の例を実行することはできません。

func run(stop <-chan struct{}) { 
    ps := exec.Command("ps") 
    for { 
     select { 
     case <-stop: 
      return 
     default: 
      ps.Run() 
      //processing the output 
     } 
    } 
} 

そしてgo run(stop):睡眠せずに、何度も繰り返し、それを実行するには

1

。 3秒ごとに実行するには(例)

func run(stop <-chan struct{}) { 
    ps := exec.Command("ps") 
    tk := time.Tick(time.Second * 3) 
    for { 
     select { 
     case <-stop: 
      return 
     case <-tk: 
      ps.Run() 
      //processing the output 
     } 
    } 
} 
関連する問題