4

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

4

4 回答 4

7

man ps

To print a process tree:
      ps -ejH
      ps axjf

pstree也可以帮助

更新:pidof用于查找命名程序的进程 pid。例如pidof chrome将获得所有 chrome pid。

于 2012-10-23T20:41:39.450 回答
3

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

在“Unix&Linux”上还有另一种方法

awk '{print $5}' < /proc/$pid/stat

或者,更安全地,

perl -l -0777 -ne '@f = /\(.*\)|\S+/g; print $f[4]' /proc/$pid/stat

请参阅链接答案中的详细信息和评论。

于 2014-05-27T16:40:00.460 回答
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 取消设置为其默认值,以便它不会在其更改的状态下徘徊。

评论

我希望这会有所帮助。这个对我有用。一旦您了解了 awk 和 ps 的工作原理,这并不是很复杂。剩下的只是解析。如果您想将 PID 作为数组传递,而不是将其打印为新行,只需使用其他内容对其进行分隔并创建一个包含所有 PID 的全局字符串变量。

于 2013-11-22T04:04:14.467 回答
-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]then call获取程序的组 ID ps -G [group-if-of-your-program]

不过,这可能不是您想要的。形成树的进程组和进程似乎是不同的东西。ppid 是进程的父 pid,您可能想要告诉您以给定 pid 作为其 ppid 的所有 pid 的东西?我认为没有什么可以保证与同一进程组中的所有 pid 相同,事实上,如果每个进程只有一个进程组,它们就不可能。

如上所述,pstree应该可以帮助您了解正在发生的事情。该--show-pids选项还将为您提供所有可能有用的 pid。

于 2013-09-02T10:06:07.270 回答