是否有可能在shell脚本中从父进程标识获取子进程标识?如何从父进程获取子进程
我有一个文件要执行使用shell脚本,这导致一个新的进程process1(父进程)。这进程1已分叉另一个进程进程2(子进程)。使用脚本,我能够得到过程1使用命令的PID:
cat /path/of/file/to/be/executed
,但我无法获取子进程的PID。
是否有可能在shell脚本中从父进程标识获取子进程标识?如何从父进程获取子进程
我有一个文件要执行使用shell脚本,这导致一个新的进程process1(父进程)。这进程1已分叉另一个进程进程2(子进程)。使用脚本,我能够得到过程1使用命令的PID:
cat /path/of/file/to/be/executed
,但我无法获取子进程的PID。
只需使用:
pgrep -P $your_process1_pid
当前进程是shell进程! –
pgrep -P \'pidofproc/path/to/your/process1 \' – Arwen
外壳工艺是$$
,因为它是一个special parameter
在Linux上,文件系统proc(5)给出了很多关于进程的信息。也许 pgrep(1)(访问/proc
)也可能有帮助。
因此请尝试cat /proc/$$/status
以获取shell进程的状态。
因此,它的父进程id可以用例如
parpid=$(awk '/PPid:/{print $2}' /proc/$$/status)
然后使用$parpid
在你的脚本来指代父进程的PID(外壳的父母)。
但我不认为你需要它!
阅读一些Bash Guide(或谨慎advanced bash scripting guide,它有错误)和advanced linux programming。
请注意,某些服务器守护进程(通常必须是唯一的)明确写入它们的pid到/var/run
,例如, sshd
服务器守护进程正在将其pid写入文本文件/var/run/sshd.pid
)。您可能希望将这样的功能添加到您自己的类似服务器的程序中(用C,C++,Ocaml,Go,Rust或其他编译的语言编码)。
#bash on chat.freenode.net's greybot: 应该避免臭名昭着的“高级”Bash脚本指南,除非你知道如何过滤掉垃圾。它会教你编写错误,而不是脚本。有鉴于此,BashGuide写道:http://mywiki.wooledge.org/BashGuide; 只是想我会提到它! – Samadi
我不知道我是否正确理解你,这有帮助吗?
ps --ppid <pid of the parent>
我写了一个scrpit来获取父进程的所有子进程pid。 这里是code.Hope它有帮助。
function getcpid() {
cpids=`pgrep -P $1|xargs`
# echo "cpids=$cpids"
for cpid in $cpids;
do
echo "$cpid"
getcpid $cpid
done
}
getcpid $1
ps -axf | grep parent_pid
上面的命令打印从parent_pid
产生的相应流程,希望它帮助。 +++++++++++++++++++++++++++++++++++++++++++
[email protected]:~/chk_prgrm/lp#
parent...18685
child... 18686
[email protected]:~/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
#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\n",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\n",i);
sleep(5);
int k=getppid();
printf("in child process %d\n",k);
}
return 0;
}
此代码可以帮助您从init()将孤儿进程作为其子进程 – user7329527
这不是一个答案。这只是一段代码,与问题无关。 – melpomene
你在说哪个孩子和哪个父母过程?根据定义,shell脚本是由shell进程执行的!你为什么问?请显示您的脚本! –
我会重写一下我的问题 – AlwaysALearner
等等......这个'cat'命令如何给你一个PID? –