How to get process details from its PID

I have maintained a list of PIDs of processes currently running on my system (Linux). From this, now it would be great if I could get the process details from this PID. I have come over syscall.Getrusage() in Go, but I am not getting the desired results.

What should I do?

314907 次浏览

你可以看看 /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))
}
}

Output:

/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

这可能不完全是询问者想要的(关于每个进程 id 需要什么类型的详细信息没有太多明确的信息) ,但是您可以通过使用 BASH 命令 ps -p $PID(ps程序状况的缩写)的 pid 来获得任务的一些详细信息

如果默认选项为 ps -p $PID,则返回:

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

可以使用 -o 选项标志显示有关此进程 id 的详细信息。

这里有一个例子,它告诉你一个特定进程 PID 的完整命令,包括参数、用户、组和内存使用情况(注意每个 multi-o 标志是如何组成一对的,以及命令是如何输出大量空白填充的) :

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

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

ps -p PID -o comm=

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

只要输入这个,你就会得到你想要的。用 PID 替换‘ type _ PID _ here’。

cat /proc/type_PID_here/status

如果希望通过 PID 查看进程的路径。您可以使用 pwdx命令。pwdx命令报告 PID 进程的完整路径。

$ pwdx 13896
13896: /home/user/python_program

注意 : 此方法只有在您拥有管理进程的特权(即使用 root 用户)时才能工作

使用终端上的 ps 命令获取进程的详细信息-

ps -Flww -p THE_PROCESS_PID

有关更多信息,请查看手册页 给你上的文档

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

ps -fp PID

它会返回这样的结果:

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