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.