在Linux操作系统中如何在一个进程组中获取PID

在Linux操作系统中如何在一个进程组中获取PID,linux,pid,process-group,Linux,Pid,Process Group,我有一个关于Linux pid的问题。如何在同一组中获得pids? 在Linux中,使用“ps”命令获取所有PID或pgid似乎很容易,但如何获取属于同一组的PID,或者换句话说,如何获取同一程序的PID? 谁能帮我一下吗?谢谢大家! 来自manps To print a process tree: ps -ejH ps axjf pstree也有帮助 更新:使用pidof查找命名程序的进程pid。e、 g.pidof chrome将获得所有chrome PID。基于m

我有一个关于Linux pid的问题。如何在同一组中获得pids? 在Linux中,使用“ps”命令获取所有PID或pgid似乎很容易,但如何获取属于同一组的PID,或者换句话说,如何获取同一程序的PID?
谁能帮我一下吗?谢谢大家!

来自
manps

To print a process tree:
      ps -ejH
      ps axjf
pstree
也有帮助


更新:使用
pidof
查找命名程序的进程pid。e、 g.
pidof chrome
将获得所有chrome PID。

基于
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
选项也将为您提供所有可能有用的pids

我为此写了一个小脚本

代码 用法 解释
  • 我想你已经知道一些Linux实用程序了。这是为bashshell编写的
  • ps-e-opgid,pid=
    只需打印出所有进程,每行的第一个值是它的组id,第二个值是它的进程id,用空格分隔
  • grep
    删除不必要的标题行
  • IFS是一个非常重要的内部变量。这样做的目的是规范字符串的分隔方式。
    for
    构造会自动使用空格字符分隔字符串,但如果将IFS变量设置为新行,则会使用新的空格字符分隔字符串。这确保每个迭代变量都是
    a
    中的一行
  • 对于每一行,我们使用
    awk
    获取第一个值-这是组ID,第二个值-这是PID
  • 如果组ID与所需匹配,则打印出相应的PID
  • 完成后,必须将IFS设置为其默认值,这样它就不会在更改后的状态中徘徊
  • 评论
    我希望这有帮助。它对我有用。一旦你了解了awk和ps是如何工作的,这就不太复杂了。其余的只是解析。如果您想将PID作为数组传递,而不是将其打印为新行,只需使用其他内容对其进行分隔,并生成一个包含所有PID的全局字符串变量。

    所有其他答案似乎都提到了
    ps
    ,但没有人试图直接访问
    /proc

    在“Unix和Linux”上有:


    请参阅链接答案中的详细信息和注释。

    您应该给出您迄今为止尝试过的示例,以及它不起作用的原因。在程序中,我可以使用getpid()或getpgid()获取一个程序的PID和pgid。另一种尝试是将链接中的“ps”命令用作“”。是的,
    ps
    命令将为您提供进程。然后,您可以
    grep
    将这些结果与您要查找的内容结合起来。是的,ps可以做到这一点。但这需要我识别具有相同组id的PID。我想要的是能够给我这些具有相同组id的PID的东西,而不是手动选择。你知道这件事吗?非常感谢。您想在程序中执行此操作吗?或者使用shell工具?您会混淆POSIX用户组和流程组。谢谢您的更正。我没有想到它是执行用户组。因此ps似乎没有提供进程组详细信息。/proc仅适用于Linux
    #!/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)
    
    awk '{print $5}' < /proc/$pid/stat
    
    perl -l -0777 -ne '@f = /\(.*\)|\S+/g; print $f[4]' /proc/$pid/stat