原标题:golang端口占用检测 原创
在运维开发的过程中,经常碰到这样的情况:启动某个应用前,需要先检测一下端口是否被其他的应用占用了,若占用了,能否得到占用进程的PID。后续可以根据这个PID,查找是哪个应用占据这端口,然后KILL掉。非常简单的需求,思路是:
利用 netstat 命令获取当前的相关端口号的PID,然后正则表达式过滤出相关的PID即可。
netstat -ano | findstr 8099
输出如下:
文章来源地址https://www.yii666.com/blog/405858.html
以windows 系统下为例,linux系统下,修改相关参数即可。代码如下:
// 传入查询的端口号
// 返回端口号对应的进程PID,若没有找到相关进程,返回-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
}