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
@tuk가 찬성 투표하십시오 플레이입니다 –