我正在开发一个可以计算Linux系统上运行的进程的插件。我四处搜索,似乎我需要访问/ proc并从那里收集信息。我也尝试使用os,os / exec和syscall包来运行外部命令ps -A --no-headers | wc -l
,但这也不起作用。我也在golang编码。欢迎任何帮助或建议。
答案 0 :(得分:4)
您可以在此处找到Linux ps
用于迭代进程列表的代码:
https://gitlab.com/procps-ng/procps/blob/master/proc/readproc.c#L1167
简而言之,算法是:
opendir
/proc
readdir
,直到返回第一个字符为数字的条目。因此,要计算进程数,您可以读取整个目录并计算匹配的条目数。
您可以在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 -c
。 exec.Command
执行单个程序(可执行文件),例如/bin/sh
或ps
或tail
。
在命令提示符下键入ps -A --no-headers | wc -l
时,此表达式由shell程序(例如/bin/sh
)解释,shell程序启动两个程序(ps
和{{1} })和管道(wc
)第一个程序的输出到第二个程序的输入。
|
相当于在终端中输入/bin/sh -c command
(有一些细微差别,请阅读command
了解详情)。