我该如何在Go语言中获取当前运行的进程列表?
OS包提供了一些函数:http://golang.org/pkg/os/ 但是没有提供查看正在运行的进程列表的函数。
我该如何在Go语言中获取当前运行的进程列表?
OS包提供了一些函数:http://golang.org/pkg/os/ 但是没有提供查看正在运行的进程列表的函数。
标准库中并没有这样的函数,而且很可能永远不会有。
大多数情况下,程序不需要进程列表。Go程序通常只希望等待单个或较少数量的进程,而不是所有进程。进程的PID通常通过其他手段获取,而不是搜索所有进程的列表。
如果您在Linux上,可以通过读取/proc
目录的内容来获取进程列表。请参阅问题“Linux API to list running processes?”
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
}
}
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)
}
这个库允许获取其他多种数据。请查看文档,根据目标操作系统提供的可用信息。
你可以使用这个库 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)
}
}
在这个库中,你还可以获取其他进程信息。
对于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版本中。