我从现在开始维护了我的系统(Linux)上当前正在运行的进程的pids列表,如果我可以从此pid中获取进程详细信息,那我就很高兴了,我已经在golang中通过syscall.Getrusage()了,但是我没有得到 预期的结果。
有人有相关的想法吗

  • 您从syscall.Getrusage得到什么结果?
  • @Atom:有关getrusage - get resource usage的信息,请参见Linux手册页。
  • 对于输入0x0和0x1,它给了我一些结构,我觉得此功能不能用于获取流程详细信息,并且仅供启动该流程的人使用下面的代码出现问题,由peterSO表示,当我正在阅读流程详细信息时 我为几个进程获取的每个pid中不存在这样的目录,因为可能不存在该目录,因为进程可能已被杀死以完成其任务。

这可能不是要求者所要的(关于每个进程ID所需的详细信息类型,并没有很多明确的信息),但是您可以使用BASH命令ps -p $PID通过其pid获得任务的一些详细信息(ps为流程状态的缩写)

默认选项为ps -p $PID时,将返回:

  • PID:回显进程ID
  • TTY:控制终端的名称(如果有)
  • TIME:自执行以来,该进程使用了??多少CPU时间(例如00:00:02)
  • CMD:调用该进程的命令(例如java)

可以使用-o options标志显示有关该进程ID的更多信息。有关列表,请参见此文档页面。

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

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

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


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

1
cat /proc/type_pid_here/status

1
ps -p PID -o comm=

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


您可以查看/proc/[pid]/stat。例如,使用Go 1,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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))
    }
}

输出:

1
/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

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

1
2
$ pwdx 13896
13896: /home/user/python_program