golang端⼝占⽤检测的使⽤
在运维开发的过程中,经常碰到这样的情况:启动某个应⽤前,需要先检测⼀下端⼝是否被其他的应⽤占⽤了,若占⽤了,能否得到占⽤进程的PID。后续可以根据这个PID,查是哪个应⽤占据这端⼝,然后KILL掉。⾮常简单的需求,思路是:
利⽤ netstat 命令获取当前的相关端⼝号的PID,然后正则表达式过滤出相关的PID即可
netstat -ano | findstr 8099
输出如下:
以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
}
补:golang 实现端⼝扫描
对端⼝进⾏扫描基于连接,在go中我们可以使⽤net.Dial进⾏判断,如果返回的结果没有错误,那么这个端⼝就应该是打开的,如果返回了错误,那么可以说明这个端⼝是关闭的,代码如下
父亲节的祝福语 简短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
}
玫瑰花的种植方法
到此这篇关于golang端⼝占⽤检测的使⽤的⽂章就介绍到这了,更多相关golang端⼝占⽤检测内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论