在Golang中计算linux上的进程

时间:2016-01-11 04:45:48

标签: linux plugins go

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

2 个答案:

答案 0 :(得分:4)

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

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

简而言之,算法是:

  1. opendir /proc
  2. 调用readdir,直到返回第一个字符为数字的条目。
  3. 因此,要计算进程数,您可以读取整个目录并计算匹配的条目数。

    您可以在Go中使用os.Open打开/proc,然后调用Readdirnames方法列出进程。

答案 1 :(得分:1)

以下程序适合我:

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 -cexec.Command执行单个程序(可执行文件),例如/bin/shpstail

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

|相当于在终端中输入/bin/sh -c command(有一些细微差别,请阅读command了解详情)。