You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Golang获取第三方进程的启动参数

在Golang中获取进程的启动参数

获取进程的启动参数需要分平台处理,以下是针对不同系统的实现方案:

类Unix系统(Linux/macOS)

类Unix系统可以直接读取/proc/<PID>/cmdline文件,该文件以**空字符(\x00)**分隔进程的所有启动参数,读取后拆分即可得到完整参数列表:

package main

import (
	"fmt"
	"io/ioutil"
	"strings"
)

// getCmdline 根据PID获取进程的启动参数列表
func getCmdline(pid int) ([]string, error) {
	data, err := ioutil.ReadFile(fmt.Sprintf("/proc/%d/cmdline", pid))
	if err != nil {
		return nil, err
	}
	// 按空字符拆分,去掉最后一个空串(文件末尾的空字符)
	parts := strings.Split(string(data), "\x00")
	return parts[:len(parts)-1], nil
}

func main() {
	targetPID := 1234 // 替换为你要查询的进程PID
	args, err := getCmdline(targetPID)
	if err != nil {
		fmt.Printf("获取参数失败:%v\n", err)
		return
	}

	fmt.Println("进程启动参数:")
	for idx, arg := range args {
		fmt.Printf("%d: %s\n", idx, arg)
	}
}

Windows平台

Windows下需要调用系统API获取进程的命令行参数,以下是基于syscall的实现,直接调用Windows原生API保证准确性:

package main

import (
	"fmt"
	"syscall"
	"unsafe"
)

var (
	kernel32                  = syscall.NewLazyDLL("kernel32.dll")
	openProcess               = kernel32.NewProc("OpenProcess")
	closeHandle               = kernel32.NewProc("CloseHandle")
	psapi                     = syscall.NewLazyDLL("psapi.dll")
	getCommandLineProcessW    = psapi.NewProc("GetCommandLineProcessW")
)

const (
	PROCESS_QUERY_INFORMATION = 0x0400
	PROCESS_VM_READ           = 0x0010
)

// getCmdline 根据PID获取进程的完整启动命令行
func getCmdline(pid int) (string, error) {
	// 打开进程获取句柄
	handle, _, err := openProcess.Call(
		uintptr(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ),
		uintptr(0),
		uintptr(pid),
	)
	if handle == 0 {
		return "", err
	}
	defer closeHandle.Call(handle) // 确保释放句柄

	// 获取命令行指针
	cmdLinePtr, _, err := getCommandLineProcessW.Call(handle)
	if cmdLinePtr == 0 {
		return "", err
	}

	// 转换为字符串
	cmdLine, err := syscall.UTF16PtrToString((*uint16)(unsafe.Pointer(cmdLinePtr)))
	if err != nil {
		return "", err
	}
	return cmdLine, nil
}

func main() {
	targetPID := 1234 // 替换为你要查询的进程PID
	cmdline, err := getCmdline(targetPID)
	if err != nil {
		fmt.Printf("获取命令行失败:%v\n", err)
		return
	}

	fmt.Println("进程启动命令行:")
	fmt.Println(cmdline)
	// 若需要拆分参数,可以使用strings.Fields或专门的命令行解析库(如github.com/spf13/pflag)
}

注意事项

  • 权限问题:获取其他进程的参数需要足够权限,Windows下可能需要管理员权限,Linux/macOS下需要对应进程的访问权限或root权限。
  • 第三方库可选:可以使用github.com/mitchellh/go-ps等库简化操作,但部分库在Windows下可能无法获取完整命令行,直接调用系统API更可靠。

内容的提问来源于stack exchange,提问作者Silk Opener

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:27:45