在 ”https://stackoverflow.com/questions/13038143/how-to-get-pids-in-one-process-group-in-linux-os“我看到所有答案都提到了ps
,但没有提到/proc
。
“ps”似乎不太可移植(Android 和 Busybox 版本需要不同的参数),我希望能够使用简单且可移植的工具列出带有 pgids 的 pid。
在 /proc/.../status 中,我看到Tgid:
(线程组 ID),Gid:
(组 id 用于安全,而不是用于将进程分组在一起),但没有PGid:
...
从 pid 获取 pgid的其他(不使用ps
)方法有哪些?
答案1
你可以看一下田野第五名在 的输出中/proc/[pid]/stat
。
$ ps -ejH | grep firefox
3043 2683 2683 ? 00:00:21 firefox
$ < /proc/3043/stat sed -n '$s/.*) [^ ]* [^ ]* \([^ ]*\).*/\1/p'
2683
从man proc
:
/proc/[pid]/stat
Status information about the process. This is used by ps(1). It is defined in /usr/src/linux/fs/proc/array.c.
The fields, in order, with their proper scanf(3) format specifiers, are:
pid %d The process ID.
comm %s The filename of the executable, in parentheses. This is visible whether or not the executable is swapped out.
state %c One character from the string "RSDZTW" where R is running, S is sleeping in an interruptible wait, D is waiting in
uninterruptible disk sleep, Z is zombie, T is traced or stopped (on a signal), and W is paging.
ppid %d The PID of the parent.
pgrp %d The process group ID of the process.
session %d The session ID of the process.
请注意,您不能使用:
awk '{print $5}'
因为该文件不是一个空白的分隔列表。第二个字段(进程名称可能包含空格甚至换行符)。例如,大多数线程的firefox
名称中通常包含空格字符。
因此,您需要)
在其中最后一次出现字符后打印第三个字段。