Go语言中当前正在运行的进程列表

28

我该如何在Go语言中获取当前运行的进程列表?

OS包提供了一些函数:http://golang.org/pkg/os/ 但是没有提供查看正在运行的进程列表的函数。


定义进程:)列出在您的操作系统上运行的进程或在Go程序中运行的goroutine列表? - proppy
3
我的操作系统中正在运行的进程列表 - Kunal P.Bharati
你需要一个跨平台的解决方案吗? - proppy
@proppy:Linux 版本也可以 :) - Kunal P.Bharati
6个回答

24

标准库中并没有这样的函数,而且很可能永远不会有。

大多数情况下,程序不需要进程列表。Go程序通常只希望等待单个或较少数量的进程,而不是所有进程。进程的PID通常通过其他手段获取,而不是搜索所有进程的列表。

如果您在Linux上,可以通过读取/proc目录的内容来获取进程列表。请参阅问题“Linux API to list running processes?”


21
这个库: github.com/mitchellh/go-ps 对我很有帮助。
import (
      ps "github.com/mitchellh/go-ps"
      ... // other imports here...
)

func whatever(){
    processList, err := ps.Processes()
    if err != nil {
        log.Println("ps.Processes() Failed, are you using windows?")
        return
    }

    // map ages
    for x := range processList {
        var process ps.Process
        process = processList[x]
        log.Printf("%d\t%s\n",process.Pid(),process.Executable())

        // do os.* stuff on the pid
    }
}

不确定为什么你被踩了... go-ps 真的很棒。 - NorseGaud

10
我建议使用以下库来实现此目的: https://github.com/shirou/gopsutil/ 下面是获取总进程数和正在运行的进程数的示例代码:
package main

import (
    "fmt"
    "github.com/shirou/gopsutil/host"
    "github.com/shirou/gopsutil/load"
)

func main() {
    infoStat, _ := host.Info()
    fmt.Printf("Total processes: %d\n", infoStat.Procs)

    miscStat, _ := load.Misc()
    fmt.Printf("Running processes: %d\n", miscStat.ProcsRunning)
}

这个库允许获取其他多种数据。请查看文档,根据目标操作系统提供的可用信息。


根据 OP 的要求查看进程列表(而不仅仅是计数):"github.com/shirou/gopsutil/process" ... processes,err:= process.Processes() - SVUser

5
如果你只需要进程信息,可以在你的go代码中运行"ps"命令,然后解析文本输出。完整的解决方案可以参考《Learning Go》书中的第29个练习@http://www.miek.nl/files/go/

4

你可以使用这个库 github.com/shirou/gopsutil

package main
import (
    "fmt"
    "github.com/shirou/gopsutil/v3/process"
)

func main() {
    processes, _ := process.Processes()
    for _, process := range processes {
        name, _ := process.Name()
        fmt.Println(name)
    }
}

在这个库中,你还可以获取其他进程信息。


2

对于Linux

我找到了一个相当简单的解决方案,可以获取正在运行的进程列表,而无需使用大型库:

package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func main() {
    matches, err := filepath.Glob("/proc/*/exe")
    for _, file := range matches {
        target, _ := os.Readlink(file)
        if len(target) > 0 {
            fmt.Printf("%+v\n", target)
        }
    }
}

它将打印每个正在运行的进程的路径。如果您只需要进程名称,则可以使用filepath.Base(target)来获取它。
这是通过取消引用/proc/[procID]/exe文件的符号链接来实现的,该符号链接指向可执行文件。这比从/proc/[procID]/status文件中读取和提取进程名称要简单得多(如我找到的其他解决方案所建议的)。
附注:这可能无法在所有发行版上工作,因为它依赖于进程文件夹中的exe文件,而这种文件可能不存在于所有Linux版本中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接