如何在Linux OS中的一个进程组中获取pid

时间:2012-10-23 19:51:17

标签: linux pid process-group

我有一个关于Linux pid事情的问题。如何在同一组中获得pids? 似乎很容易得到所有的pid或pgid与' ps' Linux中的命令,但是如何获取属于同一组的pid,或者换句话说,如何获取同一个程序的pids? 有人请给我一些帮助吗?谢谢!

4 个答案:

答案 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)

解释

  1. 我假设您已经了解了一些Linux实用程序。这是为bash shell编写的。
  2. ps -e -o pgid,pid=只打印出所有进程,每行的第一个值是其组ID,第二个值是进程ID,用空格分隔。
  3. grep删除不必要的标题行。
  4. IFS是一个非常重要的内部变量。这样做是为了规定字符串的分隔方式。 for构造使用空格字符自动分隔字符串,但如果IFS变量设置为新行,则使用此新的空白字符分隔。这可确保每个迭代变量都是来自A的行。
  5. 对于每一行,我们使用awk来获取第一个值 - 这是组ID,第二个值 - 这是PID。
  6. 如果组ID与您想要的匹配,则打印出相应的PID。
  7. 完成后,您必须将IFS取消设置为其默认值,以使其不会因更改状态而停留。
  8. 说明

    我希望有所帮助。这个对我有用。一旦你理解了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。