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

时间:2012-01-27 08:32:07

标签: go

如何在Go中获取当前正在运行的进程列表?

OS包提供了一些功能:http://golang.org/pkg/os/ 但是没有任何东西可以看到正在运行的进程列表。

5 个答案:

答案 0 :(得分:18)

标准库中没有这样的功能,很可能永远都不会。

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

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

答案 1 :(得分:4)

如果您只需要进程信息,可以从您的go代码运行“ps”命令,然后解析文本输出。

完整的解决方案可以参考“学习围棋”@ http://www.miek.nl/files/go/

中的练习29

答案 2 :(得分:1)

为此,我建议使用以下库: 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)
}

该库允许获取其他一些数据。 查看根据目标操作系统提供的可用信息的文档。

答案 3 :(得分:0)

此库: 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
    }
}

答案 4 :(得分:0)

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 文件中读取和提取进程名称要简单得多(如我发现的其他解决方案所建议的那样)。

PS:这可能不适用于所有发行版,因为它依赖于进程文件夹中的 exe 文件,该文件可能不会出现在所有版本的 Linux 中。