【问题标题】:List of currently running process in GoGo 中当前正在运行的进程列表
【发布时间】:2012-02-20 06:54:36
【问题描述】:

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

操作系统包提供了一些功能:http://golang.org/pkg/os/ 但没有给出任何内容来查看正在运行的进程列表。

【问题讨论】:

  • define processes :) 操作系统上运行的进程列表或 go 程序中运行的 goroutine 列表?
  • 我的操作系统中运行的进程列表
  • 您需要跨平台解决方案吗?
  • @proppy: linux版本就好了:)

标签: go


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    这个库: 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 很棒。
    【解决方案3】:

    我建议为此目的使用以下库: 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()
    【解决方案4】:

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

    完整的解决方案可以参考《Learning Go》一书中的练习29@http://www.miek.nl/files/go/

    【讨论】:

      【解决方案5】:

      适用于 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 中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-17
        • 1970-01-01
        • 2016-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-04
        相关资源
        最近更新 更多