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.

Reply via email to