2016-10-14 5 views
0

Ich habe Ping-Funktion, die funktioniert gut unter Windows, aber nicht unter Linux. Unter Linux pingt es wenige Hosts und stoppt (wird nicht beendet).Golang sync.WaitGroup nicht unter Linux

Ich kann Hunderte von Hosts unter Windows pingen, aber nicht unter Linux. Schauen Sie sich https://github.com/irom77/go-public/blob/master/gping/main.go für die ganze Sache

func ping(ip string, wg *sync.WaitGroup, os string) { 
     _ , err := exec.Command("ping", os, *PINGCOUNT, "-w", *PINGTIMEOUT, ip).Output()  
     if err == nil { 
      count++ 
      fmt.Printf("%d %s \n", count, ip) 
     } 
wg.Done() 
    } 

Wenn Ergebnis Druck (Hinzufügen 'Ergebnis' innerhalb func ping)

result , err := exec.Command("ping", os, *PINGCOUNT, "-w", *PINGTIMEOUT, ip).Output() 
fmt.Printf("%s\n", result) 

ich korrekte Ausgabe nur bekam, aber es tut auch weiterhin neben IPs ping

.... 
--- 10.192.167.1 ping statistics --- 
1 packets transmitted, 1 received, 0% packet loss, time 0ms 
rtt min/avg/max/mdev = 476.564/476.564/476.564/0.000 ms 

49 10.192.167.1 

erwarten mehr IPs hier (gut in Windows)

+2

Wo fügen Sie Dinge aus der WaitGroup hinzu und entfernen sie? – JimB

+1

Wenn Sie die WaitGroup in der Goroutine selbst hinzufügen, wird dies wahrscheinlich passieren. –

+0

Ich füge 'wg.Add (len (hosts))' kurz vor for loop in main() hinzu. Entferne nie etwas, es gibt 'wg.Wait()' gleich nach der Schleife – irom

Antwort

1

Sie können ignorieren g panics hier, ändern Sie Ihre Ping-Funktion zu:

func ping(ip string, wg *sync.WaitGroup, os string) { 
    defer wg.Done() 
    defer func(){ 
     if err := recover(); err != nil { 
      fmt.Println("Error with:",ip,"err:",err) 
     } 
    }() 
    result , err := exec.Command("ping", os, *PINGCOUNT, "-w", PINGTIMEOUT, ip).Output() 
    fmt.Printf("%s\n", result) 
    if err == nil { 
     count++ 
     fmt.Printf("%d %s \n", count, ip) 
    } else { 
     //fmt.Printf("%s is dead\n", ip) 
    } 
} 

dies sollte die Panik drucken, wenn es, wie auch Garantie geschieht wg.Done()

// Notiz zu nennen: Das nur knapp sein Ziel laufen, aber es ist direktional korrekt

+0

While a Panik würde das nicht abgelehnte "wg.Done" überspringen, das Original erholt sich nicht, also würde eine Panik offensichtlich werden und nichts in dieser Funktion sollte in Panik geraten. – JimB

+0

yep, du hast Recht, aus irgendeinem Grund denke ich, dass es fallen gelassen wurde schweigend –