package main import ( "log" "net" "os" "os/signal" "sync" "syscall" ) var ( wg = sync.WaitGroup{} ) func main() { InitSSH() InitGin() socketPath := "/tmp/mysock" err := os.RemoveAll(socketPath) if err != nil { log.Fatalf("error delete %s: %v", socketPath, err) } conn, err := net.ListenPacket("unixgram", socketPath) if err != nil { log.Fatalf("listen unix socket %s failed: %s", socketPath, err.Error()) } err = os.Chmod(socketPath, 0666) if err != nil { log.Fatalf("chmod 666 %s failed: %v", socketPath, err) } sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM) wg.Add(1) go func(wg *sync.WaitGroup) { select { case <-sigChan: conn.Close() os.Remove(socketPath) case <-globalCtx.Done(): conn.Close() os.Remove(socketPath) } wg.Done() }(&wg) buffer := make([]byte, 16384) for { n, _, err := conn.ReadFrom(buffer) if err != nil { // log.Printf("error read unix socket: %v", err) globalCancelFunc() break } go ParseSSHLog(string(buffer[:n])) } wg.Wait() }