是否可以从/ proc获取进程组ID?


16

在“ /programming/13038143/how-to-get-pids-in-one-process-group-in-linux-os ”中,我看到了所有提及的答案,ps而没有提及/proc

“ ps”似乎不是很可移植(Android和Busybox版本期望使用不同的参数),我希望能够使用简单且可移植的工具列出带有pgid的pid。

在/proc/.../status中,我看到了Tgid:(线程组ID),Gid:(用于安全性而不是用于将进程分组在一起的组ID),但是没有PGid:...

还有什么(不使用ps)从pid获取pgid的方法?

Answers:


24

您可以在的输出中查看字段5th/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通常在名称中都带有空格字符。

因此,您需要在最后一个出现的)字符之后打印第三个字段。


请注意,awk '{print $5}'由于进程名称(第二个字段)可能包含空格或换行符,因此不能保证为您提供正确的答案。
斯特凡Chazelas

如何可靠地解析/proc/.../stat?
六。

3
@Vi,看到这个问题的答案 perl -l -0777 -ne '@f = /\(.*\)|\S+/g; print $f[4]' "/proc/$pid/stat"p=$(cat "/proc/$pid/stat") && set ${p##*')'} && echo "$3"
斯特凡Chazelas

@StephaneChazelas:谢谢,我已经更新了答案!
cuonglm

它比文件名更多的是进程名。更改名称的进程通常会发生此问题(从它们从执行的最后一个文件的名称获得的名称)。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.