如何从父进程获取子进程
- 2024-10-31 08:38:00
- admin 原创
- 63
问题描述:
在 shell 脚本中,是否可以根据父进程 ID 获取子进程 ID?
我有一个要使用 shell 脚本执行的文件,这将导致一个新进程process1(父进程)。此进程 1已分叉另一个进程process2(子进程)。使用脚本,我可以使用以下命令获取进程 1的 pid:
cat /path/of/file/to/be/executed
但我无法获取子进程的 pid。
解决方案 1:
只需使用:
pgrep -P $your_process1_pid
解决方案 2:
我不确定我是否理解正确,这有帮助吗?
ps --ppid <pid of the parent>
解决方案 3:
我编写了一个脚本来获取父进程的所有子进程 pid。这是代码。希望它能有所帮助。
function getcpid() {
cpids=`pgrep -P $1|xargs`
# echo "cpids=$cpids"
for cpid in $cpids;
do
echo "$cpid"
getcpid $cpid
done
}
getcpid $1
解决方案 4:
获取子进程和线程pstree -p PID
。它还显示层次树
解决方案 5:
通过读取条目,您可以获取pids
给定父进程的所有子进程的信息。<pid>
`/proc/<pid>/task/<tid>/children`
此文件包含第一级子进程的 pid。对所有子进程 pid 进行递归执行此操作。
更多信息请访问https://lwn.net/Articles/475688/
解决方案 6:
shell 进程$$
因为它是一个特殊的参数
在 Linux 上, proc(5)文件系统提供了大量有关进程的信息。也许
pgrep(1)(用于访问/proc
)也可能有帮助。
因此尝试cat /proc/$$/status
获取shell进程的状态。
因此,可以使用例如以下方式检索其父进程 ID
parpid=$(awk '/PPid:/{print $2}' /proc/$$/status)
然后$parpid
在脚本中使用它来引用父进程 pid(shell 的父进程)。
但我不认为你需要它!
阅读一些Bash 指南(或谨慎阅读高级 bash 脚本指南,其中有错误)和高级 linux 编程。
请注意,一些服务器守护进程(通常需要是唯一的)明确地将其 pid 写入/var/run
,例如 sshd
服务器守护进程将其 pid 写入文本文件/var/run/sshd.pid
)。您可能希望将此类功能添加到您自己的类似服务器的程序中(以 C、C++、Ocaml、Go、Rust 或其他编译语言编写)。
解决方案 7:
ps -axf | grep parent_pid
上述命令打印了从中生成的各个进程parent_pid
,希望有所帮助。++++++++++++++++++++++++++++++++++++++++++++++++
root@root:~/chk_prgrm/lp#
parent...18685
child... 18686
root@root:~/chk_prgrm/lp# ps axf | grep frk
18685 pts/45 R 0:11 | _ ./frk
18686 pts/45 R 0:11 | | _ ./frk
18688 pts/45 S+ 0:00 | _ grep frk
解决方案 8:
你可以打印父进程调用的所有子进程的 PID:
pstree -p <PARENT_PID> | grep -oP '(K[^)]+'
这将以递归方式打印主进程及其子进程的 pid 列表
解决方案 9:
我使用以下命令收集特定进程 PID 的父进程和子进程:
ps -p $PID --ppid $PID --forest | tail -n +2 | awk '{print$1}'
请注意,这无法找到子进程的子进程。
解决方案 10:
对于感兴趣的进程树有超过 2 个级别的情况(例如 Chromium 生成 4 级深进程树),pgrep
没有多大用处。正如其他人上面提到的,procfs文件包含有关进程的所有信息,只需读取它们即可。我构建了一个名为Procpath的 CLI 工具,它就是做这个的。它读取所有/proc/N/stat
文件,将内容表示为 JSON 树并将其公开给 JSONPath 查询。
要获取非根进程的所有后代进程的逗号分隔的 PID(对于根进程而言..stat.pid
),方法是:
$ procpath query -d, "..children[?(@.stat.pid == 24243)]..pid"
24243,24259,24284,24289,24260,24262,24333,24337,24439,24570,24592,24606,...
解决方案 11:
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
// Create a child process
int pid = fork();
if (pid > 0)
{
int j=getpid();
printf("in parent process %d
",j);
}
// Note that pid is 0 in child process
// and negative if fork() fails
else if (pid == 0)
{
int i=getppid();
printf("Before sleep %d
",i);
sleep(5);
int k=getppid();
printf("in child process %d
",k);
}
return 0;
}
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件