golang使用os/exec库查询进程方式

 更新时间:2026年04月27日 09:09:25   作者:alden_ygq  
本文介绍了使用Go语言os/exec查询进程的方法,并提供了两种方式,第一种方式输出了当前系统所有运行的进程,第二种方式可以过滤出指定进程的信息

golang使用os/exec库查询进程

本文主要介绍如何使用os/exec库查询进程。

package main

import (

    "fmt"

    "os/exec"

)

func main() {

    cmd := exec.Command("ps", "-ef")

    output, err := cmd.Output()

    if err != nil {

        fmt.Println(err)

        return

    }

    fmt.Println(string(output))

}

输出:

 go run process.go
  UID   PID  PPID   C STIME   TTY           TIME CMD
    0     1     0   0  1 170  ??       114:31.61 /sbin/launchd
    0   287     1   0  1 476  ??        21:22.98 /usr/libexec/logd
    0   288     1   0  1 476  ??         1:09.95 /usr/libexec/UserEventAgent (System)
    0   290     1   0  1 476  ??         0:23.88 /System/Library/PrivateFrameworks/Uninstall.framework/Resources/uninstalld
    0   291     1   0  1 476  ??        24:42.10 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/Support/fseventsd
    0   292     1   0  1 476  ??        28:48.91 /Library/Application Support/Symantec/Silo/MES/Daemon/SymDaemon
    0   296     1   0  1 476  ??         1:01.12 /Library/PrivilegedHelperTools/AliCloudPrinterUpdater
    0   298     1   0  1 476  ??        57:11.04 /usr/sbin/systemstats --daemon
    0   300     1   0  1 476  ??        13:41.30 /usr/libexec/configd
    0   301     1   0  1 476  ??        14:46.12 /Library/Application Support/AntGroup/starpoint/Mobius
    0   303     1   0  1 476  ??         6:36.35 /System/Library/CoreServices/powerd.bundle/powerd
  501   304     1   0  1 476  ??         0:08.48 /Library/McAfee/agent/bin/macmnsvc self_start
    0   305     1   0  1 476  ??         1:48.76 /Library/McAfee/agent/bin/masvc self_start
    0   306     1   0  1 476  ??         0:00.01 /usr/libexec/IOMFB_bics_daemon
    0   309     1   0  1 476  ??         0:00.59 /usr/libexec/remoted
    0   317     1   0  1 476  ??         0:30.29 /usr/libexec/watchdogd
    0   321     1   0  1 476  ??        25:27.64 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Support/mds
    0   323     1   0  1 476  ??         0:01.38 /usr/libexec/kernelmanagerd
    0   324     1   0  1 476  ??         0:43.61 /usr/libexec/diskarbitrationd
    0   330     1   0  1 476  ??         0:31.26 /usr/sbin/syslogd
    0   333     1   0  1 476  ??         1:51.28 /usr/libexec/thermalmonitord
    0   334     1   0  1 476  ??        27:10.87 /usr/libexec/opendirectoryd
    0   335     1   0  1 476  ??         1:15.07 /System/Library/PrivateFrameworks/ApplePushService.framework/apsd
    0   337     1   0  1 476  ??         0:01.15 /Library/PrivilegedHelperTools/com.docker.vmnetd
    0   338     1   0  1 476  ??         9:32.88 /System/Library/CoreServices/launchservicesd
  213   341     1   0  1 476  ??         0:01.83 /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/Resources/usbmuxd -launchd
    0   342     1   0  1 476  ??         1:12.54 /usr/sbin/securityd -i
    0   343     1   0  1 476  ??         0:00.03 auditd -l

上述代码逻辑会获取到当前系统中所有运行的进程,但如果只需要获取制定进程信息呢,就需要针对进程进行过滤。

第一种方式

package main



import (

    "fmt"

    "bytes"
    "os/exec"

)
func RunCmd(cmdstring string) (string, error) {
	var out bytes.Buffer
	var stderr bytes.Buffer
	cmd := exec.Command("/bin/sh", "-c", cmdstring)
	cmd.Stdout = &out
	cmd.Stderr = &stderr
	err := cmd.Run()
	if err != nil {
		fmt.Printf("err:%v\n",err)
		return fmt.Sprintf("%s",stderr.String()),err
	}
	return fmt.Sprintf("%v",out.String()),nil
}

func main() {
    cmd := fmt.Sprintf("ps -ef | grep '%v'| grep -v grep","/bin/zsh --login -i")
    result,err := RunCmd(cmd)
    if err != nil {
	fmt.Printf("run cmd:%v failed:%v\n",cmd,err)
	return
    }

    fmt.Println(result)

}

输出:

$ go run process.go
  502 45987 45915   0  8 623  ttys004    0:00.09 /bin/zsh --login -i
  502 76923 45915   0 13 623  ttys009    0:00.07 /bin/zsh --login -i
  502 39231 45915   0 三02下午 ttys012    0:00.08 /bin/zsh --login -i

第二种方式

package main



import (

    "fmt"
    "strings"
    "bytes"
    "os/exec"

)
func RunCmd(cmdstring string) (string, error) {
	var out bytes.Buffer
	var stderr bytes.Buffer
	cmd := exec.Command("/bin/sh", "-c", cmdstring)
	cmd.Stdout = &out
	cmd.Stderr = &stderr
	err := cmd.Run()
	if err != nil {
		fmt.Printf("err:%v\n",err)
		return fmt.Sprintf("%s",stderr.String()),err
	}
	return fmt.Sprintf("%v",out.String()),nil
}

func main() {
    //cmd := fmt.Sprintf("ps -ef | grep '%v'| grep -v grep","/bin/zsh --login -i")
    cmd := fmt.Sprintf("ps -ef")
    result,err := RunCmd(cmd)
    if err != nil {
	fmt.Printf("run cmd:%v failed:%v\n",cmd,err)
	return
    }
    lines := strings.Split(result, "\n")
    for _, line := range lines {
        if strings.Contains(line, "/bin/zsh --login -i") {
            fmt.Println(line)
        }
    }
}

输出:

 $ go run process.go
  502 45987 45915   0  8 623  ttys004    0:00.09 /bin/zsh --login -i
  502 76923 45915   0 13 623  ttys009    0:00.07 /bin/zsh --login -i
  502 39231 45915   0 三02下午 ttys012    0:00.08 /bin/zsh --login -i

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Go 使用环境变量的实现小结

    Go 使用环境变量的实现小结

    作为软件开发人员,在项目中管理配置变量的重要性,本文主要介绍在 Golang 中处理环境变量的强大工具 github.com/joho/godotenv 包,利用这个包,你可以简化处理 .env 文件的过程,感兴趣的可以了解一下
    2025-11-11
  • 解决go 生成的exe不在bin文件夹里的问题

    解决go 生成的exe不在bin文件夹里的问题

    这篇文章主要介绍了解决go 生成的exe不在bin文件夹里的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • golang方法中receiver为指针与不为指针的区别详析

    golang方法中receiver为指针与不为指针的区别详析

    这篇文章主要给大家介绍了关于golang方法中receiver为指针与不为指针区别的相关资料,其实最大的区别应该是指针传递的是对像的引用,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-10-10
  • go如何利用orm简单实现接口分布式锁

    go如何利用orm简单实现接口分布式锁

    本篇文章主要介绍了go如何利用orm简单实现接口分布式锁,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Go标准库Flag库和Log库的使用

    Go标准库Flag库和Log库的使用

    本文主要介绍了Go标准库Flag库和Log库的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • golang 获取字符串长度的案例

    golang 获取字符串长度的案例

    这篇文章主要介绍了golang 获取字符串长度的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang排序和查找使用方法介绍

    Golang排序和查找使用方法介绍

    排序操作和查找一样是很多程序经常使用的操作。尽管一个最短的快排程序只要15行就可以搞定,但是一个健壮的实现需要更多的代码,并且我们不希望每次我们需要的时候都重写或者拷贝这些代码
    2022-12-12
  • go语言中json数据的读取和写出操作

    go语言中json数据的读取和写出操作

    这篇文章主要介绍了go语言中json数据的读取和写出操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 如何使用proto组件编译pb.go文件

    如何使用proto组件编译pb.go文件

    这篇文章主要介绍了如何使用proto组件编译pb.go文件的详细过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • go语言题解LeetCode66加一示例详解

    go语言题解LeetCode66加一示例详解

    这篇文章主要为大家介绍了go语言题解LeetCode66加一示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12

最新评论