You need to pass the WaitGroup as a pointer. This way, connectionsCount
creates a WaitGroup, increments it's counts, passes a copy of it to count
and then waits on the original; count, however, only Done()s its copy.

go vet should probably complain about that, as it contains an appropriate
marker to not be copied.

On Wed, Dec 21, 2016 at 10:35 AM, DM <subharaj.ma...@gmail.com> wrote:

> I am trying write a small golang program which will periodically execute lsof
> -i:<port> to check number of open TCP connections at a port. Code looks
> like below:-
>
> 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()
> }
>
>
> But on running the program I am seeing the ticker is not ticking
> periodically. It is just ticking once:-
>
> Tick at 2016-12-21 14:37:03.847694697 +0530 ISTPort=30002 {TCP 
> State=(LISTEN),Value=2},Port=30001 {TCP State=(LISTEN),Value=2},
>
> Can someone let me know what is going wrong?
>
>    - Go Version - 1.7.3
>
> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to