2012-02-21 15 views
27

Posiadam listę pid procesów aktualnie działających w moim systemie (Linux) od tego teraz byłoby wspaniale, gdybym mógł uzyskać szczegóły procesu z tego pid I nadszedł syscall .Getrusage() w golangu, ale nie uzyskuję pożądanych rezultatów. Czy ktoś ma pomysł z tym związany?Jak uzyskać szczegółowe informacje o procesie z jego pid

+0

Jakie wyniki uzyskujesz z 'syscall.Getrusage'? –

+0

@Atom: patrz strona podręcznika systemu Linux dla 'getrusage - get resource usage'. – peterSO

+0

dla danych wejściowych 0x0 i 0x1 daje mi trochę struct i czuję, że tej funkcji nie można użyć do uzyskania szczegółów procesu i jest do wyłącznego użytku przez tego, który rozpoczął proces, problem z poniższym kodem. Przez peterSO jest, kiedy jestem czytając szczegóły procesu każdego pida otrzymuję dla kilku procesów nie ma takiego katalogu, ponieważ może on nie występować, ponieważ proces mógł zostać zabity, zakończył swoje zadanie. – geek

Odpowiedz

2

Można spojrzeć na /proc/[pid]/stat. Na przykład za pomocą Go 1,

package main 

import (
    "fmt" 
    "io/ioutil" 
    "os" 
    "strconv" 
) 

func Pids() ([]int, error) { 
    f, err := os.Open(`/proc`) 
    if err != nil { 
     return nil, err 
    } 
    defer f.Close() 
    names, err := f.Readdirnames(-1) 
    if err != nil { 
     return nil, err 
    } 
    pids := make([]int, 0, len(names)) 
    for _, name := range names { 
     if pid, err := strconv.ParseInt(name, 10, 0); err == nil { 
      pids = append(pids, int(pid)) 
     } 
    } 
    return pids, nil 
} 

func ProcPidStat(pid int) ([]byte, error) { 
    // /proc/[pid]/stat 
    // https://www.kernel.org/doc/man-pages/online/pages/man5/proc.5.html 
    filename := `/proc/` + strconv.FormatInt(int64(pid), 10) + `/stat` 
    return ioutil.ReadFile(filename) 
} 

func main() { 
    pids, err := Pids() 
    if err != nil { 
     fmt.Println("pids:", err) 
     return 
    } 
    if len(pids) > 0 { 
     pid := pids[0] 
     stat, err := ProcPidStat(pid) 
     if err != nil { 
      fmt.Println("pid:", pid, err) 
      return 
     } 
     fmt.Println(`/proc/[pid]/stat:`, string(stat)) 
    } 
} 

wyjściowa:

/proc/[pid]/stat: 1 (init) S 0 1 1 0 -1 4202752 11119 405425 21 57 78 92 6643 527 20 0 1 0 3 24768512 563 184467440737095 
45

To może nie być dokładnie to, co chciał Pytający (nie ma tam wiele jasne informacji na jaki rodzaj informacji są wymagane dla każdego identyfikatora procesu) , ale można dostać niektóre szczegóły zadania przez jego PID używając polecenia bash ps -p $PID (ps jest skrótem procesowego statusu)

z opcjami domyślnymi ps -p $PID ten powraca:

  • PID: Echos id procesu
  • TTY: nazwa terminala sterującego (jeśli występują)
  • TIME: ile czasu CPU jest procesem stosowanym od wykonania (np 00:00:02)
  • CMD: polecenie, które nazywa się obróbce (np java)

Więcej informacji na temat identyfikatora proces można przedstawić za pomocą -o opcji flagi. Aby uzyskać listę, zobacz this documentation page.

Oto jeden przykład, który przekazuje ci pełne polecenie PID danego procesu z argumentami, użytkownikiem, grupą i pamięcią (zwróć uwagę na to, jak wiele flag -o bierze parę i jak polecenia wyprowadzane są z dużą ilością padów):

ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS 

Wskazówka: dla wyjścia człowieka odczytać w konsoli, należy args ostatnią opcję - zwykle będzie to najdłuższy i może się uciąć inaczej.

6
ps -p PID -o comm= 

Wprowadź kod powyżej, gdzie PID to PID procesu.

Powiązane problemy