So erhalten Sie Prozessdetails von der PID

76

Ich habe eine Liste von Pids von Prozessen gepflegt, die derzeit auf meinem System (Linux) ausgeführt werden. Jetzt wäre es großartig, wenn ich die Prozessdetails von dieser PID erhalten könnte. Ich bin über syscall.Getrusage () in Golang gekommen, aber ich bekomme keine gewünschten Erfolge. Hat jemand eine Idee dazu?

Geek
quelle
Welche Ergebnisse erzielen Sie syscall.Getrusage?
@Atom: Siehe die Linux-Manpage für getrusage - get resource usage.
PeterSO
Für die Eingabe 0x0 und 0x1 gibt es mir eine Struktur und ich habe das Gefühl, dass diese Funktion nicht zum Abrufen von Prozessdetails verwendet werden kann und ausschließlich von demjenigen verwendet wird, der einen Prozess gestartet hat. Das Problem mit dem folgenden Code von peterSO ist, wenn ich lese Prozessdetails der einzelnen Pids, die ich für wenige Prozesse erhalte, gibt es kein solches Verzeichnis, da es möglicherweise nicht vorhanden ist, da der Prozess möglicherweise abgebrochen wurde und seine Aufgabe abgeschlossen hat.
Geek

Antworten:

98

Dies ist möglicherweise nicht genau das, was der Fragesteller wollte (es gibt nicht viele klare Informationen darüber, welche Art von Details für jede Prozess-ID erforderlich sind), aber Sie können einige Details einer Aufgabe über ihre PID mit dem Befehl BASH abrufen ps -p $PID( ps steht für process Status )

Mit Standardoptionen wie ps -p $PIDfolgt:

  • PID: Gibt die Prozess-ID wieder
  • TTY: der Name des steuernden Terminals (falls vorhanden)
  • ZEIT: Wie viel CPU-Zeit hat der Prozess seit der Ausführung verwendet (z. B. 00:00:02)?
  • KMD: der Befehl, der den Prozess aufgerufen (z java)

Weitere Informationen zu dieser Prozess-ID können mit dem Optionsflag -o angezeigt werden. Eine Liste finden Sie auf dieser Dokumentationsseite .

Hier ist ein Beispiel, das Ihnen den vollständigen Befehl einer bestimmten Prozess-PID mit Argumenten, Benutzer-, Gruppen- und Speichernutzung zeigt (beachten Sie, wie die mehreren -o-Flags jeweils ein Paar annehmen und wie der Befehl mit viel Leerzeichen ausgegeben wird):

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

Tipp: Wenn Sie in der Konsole von Menschen gelesen werden möchten, machen Sie args zur letzten Option. In der Regel ist dies die längste und wird sonst möglicherweise abgebrochen.

user56reinstatemonica8
quelle
18

Geben Sie einfach dies ein und Sie erhalten, was Sie wollen. Ersetzen Sie 'type_pid_here' durch pid.

cat /proc/type_pid_here/status
Saroj Rai
quelle
12
ps -p PID -o comm=

Geben Sie den obigen Code ein, wobei PID die PID des Prozesses ist.

Galeeb Basha
quelle
5

Du könntest es dir ansehen /proc/[pid]/stat. Verwenden Sie beispielsweise 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))
    }
}

Ausgabe:

/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
peterSO
quelle
3

Wenn Sie den Prozesspfad anhand der PID anzeigen möchten. Sie können den pwdxBefehl verwenden. Der pwdxBefehl meldet das aktuelle Arbeitsverzeichnis eines Prozesses oder von Prozessen:

$ pwdx 13896
13896: /home/user/python_program
nguyenvanhieuvn
quelle