在 Golang 中,可以使用 net 包来查询占用指定端口的进程名。以下是一个示例代码:

package main

import (
	"fmt"
	"net"
	"os"
	"os/exec"
	"runtime"
	"strconv"
	"strings"
)

func main() {
	if len(os.Args) < 2 {
		fmt.Println("Please provide a port number as an argument")
		return
	}

	port, err := strconv.Atoi(os.Args[1])
	if err != nil {
		fmt.Println("Invalid port number")
		return
	}

	processName, err := findProcessName(port)
	if err != nil {
		fmt.Println("Failed to find process name:", err)
		return
	}

	fmt.Println("Process name:", processName)
}

func findProcessName(port int) (string, error) {
	var cmd *exec.Cmd

	switch runtime.GOOS {
	case "windows":
		cmd = exec.Command("netstat", "-ano")
	case "linux":
		cmd = exec.Command("netstat", "-tuln")
	default:
		return "", fmt.Errorf("Unsupported operating system: %s", runtime.GOOS)
	}

	output, err := cmd.Output()
	if err != nil {
		return "", err
	}

	lines := strings.Split(string(output), "\n")
	for _, line := range lines {
		fields := strings.Fields(line)
		if len(fields) >= 2 && fields[1] == fmt.Sprintf(":%d", port) {
			pid := fields[len(fields)-1]
			processName, err := getProcessName(pid)
			if err != nil {
				return "", err
			}
			return processName, nil
		}
	}

	return "", fmt.Errorf("No process found on port %d", port)
}

func getProcessName(pid string) (string, error) {
	switch runtime.GOOS {
	case "windows":
		cmd := exec.Command("tasklist", "/FI", fmt.Sprintf("PID eq %s", pid), "/FO", "CSV", "/NH")
		output, err := cmd.Output()
		if err != nil {
			return "", err
		}
		fields := strings.Split(string(output), ",")
		if len(fields) >= 2 {
			processName := strings.Trim(fields[0], "'")
			return processName, nil
		}
	case "linux":
		cmd := exec.Command("ps", "-p", pid, "-o", "comm=")
		output, err := cmd.Output()
		if err != nil {
			return "", err
		}
		processName := strings.TrimSpace(string(output))
		return processName, nil
	}

	return "", fmt.Errorf("Unsupported operating system: %s", runtime.GOOS)
}

在命令行中运行该程序,并提供一个端口号作为参数,它将输出占用该端口的进程名。例如:

go run main.go 8080

输出:

Process name: chrome.exe

请注意,此代码在不同的操作系统上使用了不同的命令来查询进程名。在 Windows 上,它使用 tasklist 命令,而在 Linux 上,它使用 ps 命令。如果需要在其他操作系统上运行,请根据需要修改代码。

Golang 查询占用端口的进程名 - 详细教程和示例代码

原文地址: https://www.cveoy.top/t/topic/fKIP 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录