Список текущего процесса в Go

Как я могу получить список текущих запущенных процессов в Go?

Пакет ОС предоставляет некоторые функции: http://golang.org/pkg/os/, но ничего не дает, чтобы увидеть список запущенных процессов.

Ответ 1

В стандартной библиотеке такой функции нет и, скорее всего, никогда не будет.

В большинстве случаев список процессов не требуется для программ. Обычно программы Go хотят ждать одиночного или меньшего количества процессов, а не для всех процессов. PIDs процессов обычно получают другими способами, чем поиск списка всех процессов.

Если вы работаете в Linux, список процессов можно получить, прочитав содержимое каталога /proc. См. Вопрос API Linux для отображения запущенных процессов?

Ответ 2

Если вам нужна только информация о процессе, вы можете просто запустить команду "ps" из вашего кода go, а затем проанализировать вывод текста.

Полное решение может относиться к упражнению 29 в книге "Learning Go" @http://www.miek.nl/files/go/

Ответ 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)
}

Библиотека позволяет получить несколько других данных. Взгляните на документацию для получения доступной информации в соответствии с целевой операционной системой.

Ответ 4

Эта библиотека: 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
    }
}