golang官方包:

https://studygolang.com/pkgdoc

os

支持获取当前进程pid并kill、但是仅仅限于获取当前进程pid

FindProcess().Kill()
os.Getpid()

基础用法;但是却没有提供依据端口号获取对应的pid,所以还是执行shell指令对结果集进行过滤获取pid

// 获取8299端口对应进程号并kill
processInfo := exec.Command("/bin/sh", "-c",`lsof -i:8299 | awk '{print $2}' | awk  'NR==2{print}'`)
if pid, err := processInfo.Output(); err != nil {
    fmt.Println(err.Error())
}else{
    fmt.Println(string(pid))
    processExit := exec.Command("/bin/sh", "-c",`kill `+string(pid))
    if _, err := processExit.Output(); err != nil {
        fmt.Println(err.Error())
    }
}

and

// 传入查询的端口号
// 返回端口号对应的进程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
}

端口检测:

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
}

参考博客:

https://www.jb51.net/article/208384.htm