golang併發ping主機
利用了golang對高併發的良好支援,同目錄下將ip每行一個寫入pinglist.txt檔案即可
其實這個功能用linux一條命令就能搞定:
cat pinglist.txt | xargs -P 10 -I {} ping -fc 100 {}
package main
import (
"bufio"
"bytes"
"fmt"
"io"
"io/ioutil"
"log"
"os"
"os/exec"
"strings"
"sync"
"runtime"
)
func RunCMD(command string) string {
in := bytes.NewBuffer(nil)
cmd := exec.Command("sh")
cmd.Stdin = in
in.WriteString(command + "\n")
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Fatal(err)
}
defer stdout.Close()
if err := cmd.Start(); err != nil {
log.Fatal(err)
}
opBytes, err := ioutil.ReadAll(stdout)
if err != nil {
log.Fatal(err)
}
return string(opBytes)
}
func ping(ip string) string {
cmd := "ping -fc 100 " + ip
return RunCMD(cmd)
}
var ips = []string{}
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
fileName := "pinglist.txt"
f, err := os.Open(fileName)
if err != nil {
fmt.Println(err)
}
buf := bufio.NewReader(f)
for {
line, err := buf.ReadString('\n')
line = strings.TrimSpace(line)
if err != nil {
if err == io.EOF {
//fmt.Println("File read over!")
break
}
fmt.Println(err)
}
ips = append(ips, line)
}
wg := &sync.WaitGroup{}
ch := make(chan string, len(ips))
//fmt.Println(ips)
for i:= 0; i < len(ips); i++ {
wg.Add(1)
go func(i int) {
ch <- ping(ips[i])
wg.Done()
}(i)
}
wg.Wait()
//fmt.Println(len(ch))
for i := 0; i < len(ips); i++ {
fmt.Println(<-ch)
}
}
相關文章
- 批量ping主機
- 主機ping不了虛擬機器虛擬機
- golang併發Golang
- 【EBS】主機併發程式開發
- 主機與virtualbox虛擬機器的互ping虛擬機
- C# 實現Ping遠端主機功能C#
- 「Golang成長之路」併發之併發模式Golang模式
- 第09章 Go語言併發,Golang併發Golang
- 「Golang成長之路」併發之併發模式篇Golang模式
- golang併發程式設計Golang程式設計
- Golang 併發程式設計Golang程式設計
- [Golang併發]Sync.mapGolang
- VirtualBox 主機ping不通虛擬機器的解決辦法虛擬機
- Golang語言goroutine協程併發安全及鎖機制Golang
- Golang常見的併發模式Golang模式
- Golang Channel 高併發的初始Golang
- Golang通脈之併發初探Golang
- golang開發:go併發的建議Golang
- 虛擬機器 與 host主機,無法ping通的問題虛擬機
- [譯] part 20: golang 併發介紹Golang
- Golang併發程式設計基礎Golang程式設計
- 「Golang成長之路」併發之GoroutineGolang
- Golang 併發程式設計實踐Golang程式設計
- 關於解決主機和虛擬機器ping不通的問題虛擬機
- Golang面向併發的記憶體模型Golang記憶體模型
- Golang 高效實踐之併發實踐Golang
- Golang協程併發的流水線模型Golang模型
- Golang 基礎之併發知識 (三)Golang
- Golang 併發程式設計(channel實現)Golang程式設計
- 「Golang成長之路」併發之Channel下Golang
- 「Golang成長之路」併發之Channel上Golang
- Golang併發程式設計——goroutine、channel、syncGolang程式設計
- 說說Golang goroutine併發那些事兒Golang
- 2020-11-30-golang併發模式contextGolang模式Context
- Golang併發之共享記憶體變數Golang記憶體變數
- 「Golang成長之路」併發之channel篇2Golang
- 「Golang成長之路」併發任務的控制Golang
- golang 限流器,控制併發,執行緒池Golang執行緒