在運(yùn)維開發(fā)的過程中,經(jīng)常碰到這樣的情況:啟動(dòng)某個(gè)應(yīng)用前,需要先檢測一下端口是否被其他的應(yīng)用占用了,若占用了,能否得到占用進(jìn)程的PID。后續(xù)可以根據(jù)這個(gè)PID,查找是哪個(gè)應(yīng)用占據(jù)這端口,然后KILL掉。非常簡單的需求,思路是:
利用 netstat 命令獲取當(dāng)前的相關(guān)端口號(hào)的PID,然后正則表達(dá)式過濾出相關(guān)的PID即可
netstat -ano | findstr 8099
輸出如下:
以windows 系統(tǒng)下為例,linux系統(tǒng)下,修改相關(guān)參數(shù)即可。代碼如下:
// 傳入查詢的端口號(hào)
// 返回端口號(hào)對(duì)應(yīng)的進(jìn)程PID,若沒有找到相關(guān)進(jìn)程,返回-1
func portInUse(portNumber int) int {
res := -1
var outBytes bytes.Buffer
cmdStr := fmt.Sprintf("netstat -ano -p tcp | findstr %d", portNumber)
cmd := exec.Command("cmd", "/c", cmdStr)
cmd.Stdout = outBytes
cmd.Run()
resStr := outBytes.String()
r := regexp.MustCompile(`\s\d+\s`).FindAllString(resStr, -1)
if len(r) > 0 {
pid, err := strconv.Atoi(strings.TrimSpace(r[0]))
if err != nil {
res = -1
} else {
res = pid
}
}
return res
}
補(bǔ):golang 實(shí)現(xiàn)端口掃描
對(duì)端口進(jìn)行掃描基于連接,在go中我們可以使用net.Dial進(jìn)行判斷,如果返回的結(jié)果沒有錯(cuò)誤,那么這個(gè)端口就應(yīng)該是打開的,如果返回了錯(cuò)誤,那么可以說明這個(gè)端口是關(guān)閉的,代碼如下
func ScanPort(protocol string, hostname string, port int) bool {
fmt.Printf("scanning port %d \n", port)
p := strconv.Itoa(port)
addr := net.JoinHostPort(hostname, p)
conn, err := net.DialTimeout(protocol, addr, 3*time.Second)
if err != nil {
return false
}
defer conn.Close()
return true
}
到此這篇關(guān)于golang端口占用檢測的使用的文章就介紹到這了,更多相關(guān)golang端口占用檢測內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- go語言制作端口掃描器
- Go語言實(shí)現(xiàn)的簡單網(wǎng)絡(luò)端口掃描方法
- GO語言實(shí)現(xiàn)的端口掃描器分享