我在Linux pid上有一个问题。如何在同一组中获得pids? 在Linux中使用'ps'命令获得所有pid或pgid似乎很容易,但是如何获得属于同一组的pid,或者换句话说,如何获得同一个程序的pid? 任何人都请给我一些帮助吗?谢谢!如何在Linux操作系统中的一个进程组中获得pids
回答
从man ps
To print a process tree:
ps -ejH
ps axjf
pstree
还可以帮助
更新:使用pidof
找到指定的程序,进程的PID。例如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]
然后调用ps -G [group-if-of-your-program]
程序组ID。
这可能不是你想要的。形成树的进程组和进程似乎是不同的东西。 ppid是一个进程的父进程,你可能需要一些东西来告诉你所有的pid都带有一个给定的pid作为他们的ppid?我不认为有任何事情可以保证与同一个进程组中的所有pid相同,实际上,如果每个进程只有一个进程组,它们不可能是。
如上所述,pstree
应该可以帮助您了解发生了什么。 --show-pids
选项将为您提供所有可能有用的pid。
您在混淆POSIX用户组和进程组。 –
谢谢你的纠正。我没有想到它是执行用户组。所以ps似乎没有提供进程组的细节。 – TafT
我为此写了一个小脚本。
代码
#!/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)
说明
- 我假设你知道一些Linux工具了。这是仅为bash shell编写的。
ps -e -o pgid,pid=
只需打印出所有进程,每行的第一个值为其组标识,第二个值为进程标识,用空格分隔。grep
删除不必要的标题行。- IFS是一个非常重要的内部变量。它所做的是规定字符串是如何分隔的。
for
构造会自动使用空格字符分隔字符串,但如果IFS变量设置为新行,则会使用此新的空白字符进行分隔。这确保每个迭代变量都是从A
开始的一行。 - 对于每一行,我们使用
awk
获取第一个值 - 这是组ID,第二个值 - 这是PID。 - 如果组ID匹配你想要的,然后打印出相应的PID。
- 完成之后,您必须将IFS重置为其默认值,以便它不会随其状态发生变化。
备注
我希望帮助。这个对我有用。一旦你了解了awk和ps的工作方式,这并不是很复杂。其余的只是解析。如果你想以一个数组的形式传递PID,而不是将它作为一个新行打印出来,只需使用别的方法对其进行分隔,并创建一个全局字符串变量来存放所有的PID。
所有其他答案似乎提到ps
,但没有人试图直接访问/proc
。
开 “的Unix & Linux的” 有one more approach:
awk '{print $5}' < /proc/$pid/stat
,或者更安全,
perl -l -0777 -ne '@f = /\(.*\)|\S+/g; print $f[4]' /proc/$pid/stat
见链接查看回答详情和评论。
/proc只适用于Linux – seo
- 1. 如何在c for linux操作系统中创建一个两个进程?
- 2. 如何在一个操作系统中安装oracle并在其他操作系统(windows和linux)中使用
- 3. 操作系统可以在Linux中随机杀死进程吗?
- 4. 如何从Request.UserAgent获得操作系统?
- 5. 如何获得操作系统名称
- 6. 我该如何要求操作系统在另一个内核上运行每个线程? - Linux操作系统
- 7. 如何在c#中获得真正的操作系统版本?
- 8. 操作系统中的后台进程
- 9. Linux操作系统
- 10. 如何开始在类Unix操作系统(如Linux)中编写守护进程?
- 11. 在Linux操作系统Ubuntu
- 12. 如何在Java中获得操作系统
- 13. 如何在自制操作系统中获得键盘输入?
- 14. “ulimit -v”如何在Linux操作系统中工作?
- 15. 进程和线程在操作系统
- 16. 如何在另一个操作系统中部署一个包
- 17. 如何在动态编程中获得一组操作
- 18. 如何设计linux操作系统?
- 19. 如何关闭在Linux操作系统中的AVD
- 20. CLI Linux操作系统
- 21. Linux操作系统(Ubuntu)
- 22. 如何运行一个shell启动linux操作系统?
- 23. 在Linux中如何表示操作系统语言
- 24. 如何在Linux客户机操作系统中输入符号(@)
- 25. 如何在Linux操作系统中删除Tomcat和Play日志?
- 26. 如何在linux操作系统中设置solr/home?
- 27. 操作系统如何获取进程切换
- 28. 如何在窗口操作系统中使用安装在linux操作系统上的PHP接口?
- 29. Linux中子进程的系统限制
- 30. Qt中的linux系统守护进程
您应该举例说明迄今为止您尝试过的方法以及它为什么不起作用。 –
在程序中,我可以使用getpid()或getpgid()来获得一个程序的pid和pgid。另一个尝试是将链接中的'ps'命令定义为'http://linux.about.com/od/commands/l/blcmdl1_ps.htm'。 – dylanoo
是的,'ps'命令会为你提供进程。然后你可以用你正在寻找的东西来“grep”这些结果。 –