如何从其pid获取进程详细信息

gee*_*eek 48 go

我已经维护了一个当前正在我的系统(Linux)上运行的进程的列表,现在如果我可以从这个pid获取进程详细信息,我会在golang中遇到syscall.Getrusage()但是我没有得到期望的结果.有没有人有与之相关的想法

use*_*ca8 76

这可能不是提问者想要的(关于每个进程id需要什么类型的细节没有太多明确的信息),但你可以使用BASH命令通过其pid得到任务的一些细节ps -p $PID(ps进程的简称地位)

使用默认选项ps -p $PID返回:

  • PID:回显进程ID
  • TTY:控制终端的名称(如果有)
  • TIME:执行后进程使用的CPU时间(例如00:00:02)
  • CMD:调用进程的命令(例如java)

可以使用-o选项标志显示有关此进程ID的更多信息.有关列表,请参阅此文档页面.

下面是一个示例,告诉您特定进程PID的完整命令,包括参数,用户,组和内存使用情况(注意多个-o标志如何成对,以及命令如何输出大量的空白填充):

ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
Run Code Online (Sandbox Code Playgroud)

提示:对于控制台中的人工读取输出,使args成为最后一个选项 - 它通常是最长的,否则可能会缩短.


use*_*210 26

最短、最有效的选择可能是

ps -fp PID
Run Code Online (Sandbox Code Playgroud)

它会返回类似:

UID            PID    PPID  C STIME TTY          TIME CMD
adam         78557    3688  0 Sep12 ?        00:00:07 /bin/python -m ipykernel_launcher -f /home/adam/.local/share/jupyter/runtime/kernel-aca88d6b.json
Run Code Online (Sandbox Code Playgroud)


小智 9

ps -p PID -o comm=
Run Code Online (Sandbox Code Playgroud)

输入上面的代码,其中PID是过程的PID.


ngu*_*uvn 7

如果你想通过PID查看进程的路径。您可以使用pwdx命令。该pwdx命令报告一个或多个进程的当前工作目录:

$ pwdx 13896
13896: /home/user/python_program
Run Code Online (Sandbox Code Playgroud)


pet*_*rSO 5

你可以看看/proc/[pid]/stat。例如,使用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))
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

/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
Run Code Online (Sandbox Code Playgroud)

  • 应该有一个解释。例如,“/proc/44021/stat”输出中这些数字的含义是什么?处理它们的总体思路是什么?运作原理是什么?也许链接到一些*特定的*文档(不是一些高级页面)。请通过[编辑(更改)您的答案](https://stackoverflow.com/posts/9380182/edit) 进行回复,而不是在评论中回复(***没有***“编辑:”、“更新:”或类似 - 答案应该看起来像今天写的一样)。 (2认同)

Sar*_*Rai 5

只需键入此内容,您将得到所需的内容,用pid替换“ type_pid_here”。

cat /proc/type_pid_here/status
Run Code Online (Sandbox Code Playgroud)