2016-12-21 1 views
0

포트에서 열린 TCP 연결 수를 확인하기 위해 주기적으로 lsof -i:<port>을 실행할 작은 골란 프로그램을 작성하려고합니다. 코드는 다음과 같습니다 : -포트에서 열려있는 TCP 연결을 정기적으로 검사하는 Golang

package main 

import (
    "fmt" 
    "log" 
    "os/exec" 
    "strings" 
    "sync" 
    "time" 
) 

type Lsof struct { 
    Command string 
    Pid  string 
    User  string 
    Fd  string 
    Type  string 
    Device string 
    SizeOff string 
    Node  string 
    Name  string 
    TCPState string 
} 

//var result = make([]*Lsof, 0) 
var ports = []int{30001, 30002} 

func main() { 
    done := make(chan bool) 
    ticker := time.NewTicker(5 * time.Millisecond) 
    go func() { 
     for t := range ticker.C { 
      fmt.Println("Tick at", t) 
      connectionsCount() 
     } 
    }() 
    <-done 
} 

func connectionsCount() { 
    var wg sync.WaitGroup 
    wg.Add(len(ports)) 
    for _, v := range ports { 
     go count(v, wg) 
    } 
    wg.Wait() 
} 

func count(port int, wg sync.WaitGroup) { 
    defer wg.Done() 
    var tcpState = make(map[string]int) 
    out, err := exec.Command("/bin/sh", "-c", fmt.Sprintf("lsof -i:%d", port)).Output() 
    if err != nil { 
     log.Fatal(err) 
    } 
    //fmt.Println(string(out)) 
    num := strings.Split(string(out), "\n") 
    for no, n := range num { 
     if no == 0 { 
      continue 
     } 
     n = strings.TrimSpace(n) 
     if len(n) <= 0 { 
      continue 
     } 
     i := 0 
     temp := strings.Split(n, " ") 
     cleanedVal := make([]string, 10) 
     for _, v := range temp { 
      v = strings.TrimSpace(v) 
      if len(v) <= 0 { 
       continue 
      } 
      cleanedVal[i] = v 
      i++ 
     } 
     if len(cleanedVal) < 8 { 
      //log.Println(n) 
      continue 
     } 
     l := new(Lsof) 
     l.Command = cleanedVal[0] 
     l.Pid = cleanedVal[1] 
     l.User = cleanedVal[2] 
     l.Fd = cleanedVal[3] 
     l.Type = cleanedVal[4] 
     l.Device = cleanedVal[5] 
     l.SizeOff = cleanedVal[6] 
     l.Node = cleanedVal[7] 
     l.Name = cleanedVal[8] 
     if l.Node == "TCP" { 
      l.TCPState = cleanedVal[9] 
      count, ok := tcpState[l.TCPState] 
      if !ok { 
       tcpState[l.TCPState] = 1 
      } else { 
       tcpState[l.TCPState] = count + 1 
      } 
     } 
     //fmt.Printf("\n%+v", *l) 
     //result = append(result, l) 
    } 
    fmt.Printf("Port=%d ", port) 
    for k, v := range tcpState { 
     fmt.Printf("{TCP State=%s,Value=%d},", k, v) 
    } 
    fmt.Println() 
} 

그러나 프로그램이 실행 중일 때 나는 시세표가 주기적으로 똑딱 거리는 것을보고 있습니다.

Tick at 2016-12-21 14:37:03.847694697 +0530 IST 
Port=30002 {TCP State=(LISTEN),Value=2}, 
Port=30001 {TCP State=(LISTEN),Value=2}, 

누군가가 나에게 무슨 문제가 있는지 알 수 있습니까?

  • 이동 버전 - 1.7.3

답변

2

는 여기에서 문제는 Ticker 당신은 값으로 WaitGroup을 통과하지 않는다

for t := range ticker.C { 
     fmt.Println("Tick at", t) 
     // connectionsCount() 
    } 

을 시도하지입니다. 포인터로 wg을 전달하면 문제가 해결됩니다. fuction를가

여기
..... 
    func connectionsCount() { 
     var wg = &sync.WaitGroup{} 
     wg.Add(len(ports)) 
     for _, v := range ports { 
      go count(v, wg) 
     } 
     wg.Wait() 
    } 
    func count(port int, wg *sync.WaitGroup) { 
    ....... 

에 어느

업데이트를 기다리고 있던 것은 대답은 당신을 elped 경우 link

+0

@tuk가 찬성 투표하십시오 플레이입니다 –

관련 문제