为了账号安全,请及时绑定邮箱和手机立即绑定

在 Golang 中计算 linux 上的进程

在 Golang 中计算 linux 上的进程

Go
慕慕森 2021-12-07 09:30:00
我正在开发一个插件,它可以计算在 Linux 系统上运行的进程。我四处搜索,似乎我需要访问 /proc 并从那里收集信息。我还尝试使用 os、os/exec 和 syscall 包来运行外部命令,ps -A --no-headers | wc -l但这也不起作用。我也在用 golang 编写代码。欢迎任何帮助或建议。
查看完整描述

2 回答

?
www说

TA贡献1775条经验 获得超8个赞

您可以在ps此处找到 Linux用于遍历进程列表的代码:

https://gitlab.com/procps-ng/procps/blob/master/proc/readproc.c#L1167

简而言之,算法是:

  1. opendir 在 /proc

  2. 调用readdir直到返回第一个字符是数字的条目。

因此,要计算进程数,您可以通读整个目录并计算匹配的条目数。

您可以在 Go 中使用os.Opento open执行此操作/proc,然后调用该Readdirnames方法列出进程。


查看完整回答
反对 回复 2021-12-07
?
jeck猫

TA贡献1909条经验 获得超7个赞

以下程序对我有用:


package main


import (

    "fmt"

    "log"

    "os/exec"

)


func main() {

    out, err := exec.Command("/bin/sh", "-c", "ps -A --no-headers | wc -l").Output()

    if err != nil {

        log.Fatal(err)

    }

    fmt.Printf("Number of running processes: %s\n", out)

}

请注意,您必须使用/bin/sh -c. exec.Command执行单个程序(可执行文件),例如/bin/sh或ps或tail。


当您ps -A --no-headers | wc -l在命令提示符中键入此表达式时,该表达式由 shell 程序(例如/bin/sh)解释,并且 shell 程序启动两个程序(ps和wc)并将|第一个程序的输出()管道()到第二个程序的输入。


/bin/sh -c command相当于command在终端中键入(有一些细微差别,请阅读man sh以了解更多详细信息)。


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信