我有一个关于Linux pid事情的问题。如何在同一组中获得pids? 似乎很容易得到所有的pid或pgid与' ps' Linux中的命令,但是如何获取属于同一组的pid,或者换句话说,如何获取同一个程序的pids? 有人请给我一些帮助吗?谢谢!
答案 0 :(得分:7)
来自man ps
To print a process tree:
ps -ejH
ps axjf
pstree
也可以提供帮助
更新:使用pidof
查找指定程序的进程pid。例如pidof chrome
将获得所有chrome pids。
答案 1 :(得分:3)
所有其他答案似乎都提及ps
,但没有人直接尝试访问/proc
。
On" Unix& Linux"那里one more approach:
awk '{print $5}' < /proc/$pid/stat
或更安全地
perl -l -0777 -ne '@f = /\(.*\)|\S+/g; print $f[4]' /proc/$pid/stat
查看链接答案中的详细信息和评论。
答案 2 :(得分:0)
我为此目的写了一个小脚本。
#!/bin/bash
MY_GROUP_ID=$1
A="$(ps -e -o pgid,pid= | grep [0-9])"
#printf "$A\n"
IFS=$'\n'
for i in $A; do
GROUP_ID=$(printf "$i" | awk -F ' ' '{print $1}')
PID=$(printf "$i" | awk -F ' ' '{print $2}')
if [ "$GROUP_ID" = "$MY_GROUP_ID" ]; then
printf "$PID\n"
fi
done
unset IFS
./test_script.sh (group ID you want to select for)
ps -e -o pgid,pid=
只打印出所有进程,每行的第一个值是其组ID,第二个值是进程ID,用空格分隔。grep
删除不必要的标题行。for
构造使用空格字符自动分隔字符串,但如果IFS变量设置为新行,则使用此新的空白字符分隔。这可确保每个迭代变量都是来自A
的行。awk
来获取第一个值 - 这是组ID,第二个值 - 这是PID。我希望有所帮助。这个对我有用。一旦你理解了awk和ps是如何工作的,它就不是很复杂了。其余的只是解析。如果要将PID作为数组传递,而不是将其作为新行打印,只需使用其他内容对其进行分隔,并创建一个包含所有PID的全局字符串变量。
答案 3 :(得分:-1)
基于man ps
,有四个参数处理组:
-G grplist
Select by real group ID (RGID) or name. This selects the processes whose real group name or ID is in the grplist list. The real group ID identifies the group of the user who created the process, see getgid(2).
-g grplist
Select by session OR by effective group name. Selection by session is specified by many standards, but selection by effective group is the logical behavior that several other operating systems use. This ps will select by session when the list is
completely numeric (as sessionsare). Group ID numbers will work only when some group names are also specified. See the -s and --group options.
--Group grplist
Select by real group ID (RGID) or name. Identical to -G.
--group grplist
Select by effective group ID (EGID) or name. This selects the processes whose effective group name or ID is in grouplist. The effective group ID describes the group whose file access permissions are used by the process (see getegid(2)). The -g
option is often an alternative to --group.
因此,您可以使用getpgrp [pid-of-your-program]
获取程序的组ID,然后调用ps -G [group-if-of-your-program]
。
这可能不是你想要的。组成树的进程组和进程似乎是不同的东西。 ppid是一个进程的父pid,你可能想要一些东西告诉你所有pid都有一个给定的pid作为他们的ppid?我认为没有什么可以保证与同一进程组中的所有pid相同,事实上,如果每个进程只有一个进程组,那么它们就不可能。
如上所述,pstree
应该可以帮助您了解正在发生的事情。 --show-pids
选项会为您提供所有可能有用的pid。