Как получить дочерний процесс от родительского процесса
можно ли получить идентификатор дочернего процесса из идентификатора родительского процесса в сценарии оболочки?
У меня есть файл для выполнения с помощью сценария оболочки, который приводит к новому процессу process1 (родительский процесс). Это process1 раздвоился другой процесс process2(дочерний процесс). Используя скрипт, я могу получить pid process1 С помощью команды:
cat /path/of/file/to/be/executed
но я не могу получить pid ребенка процесс.
7 ответов
Я написал scrpit, чтобы получить все дочерние pids процесса родительского процесса. Вот код.Надеюсь, это поможет.
function getcpid() {
cpids=`pgrep -P |xargs`
# echo "cpids=$cpids"
for cpid in $cpids;
do
echo "$cpid"
getcpid $cpid
done
}
getcpid
процесс оболочки $$
так как специальный параметр
в Linux proc (5) файловая система дает много информации о процессах. Возможно
pgrep(1) (к /proc
) могут тоже помочь.
так попробуй cat /proc/$$/status
чтобы получить статус процесса оболочки.
следовательно, его Родительский идентификатор процесса может быть получен, например,
parpid=$(awk '/PPid:/{print }' /proc/$$/status)
затем использовать $parpid
в вашем скрипте обратитесь к родительскому процессу pid (родительский процесс оболочки).
но я не думаю, что вам это нужно!
читать некоторые Bash Guide (или с осторожностью расширенный bash руководство сценариев, который имеет ошибки) и расширенное Программирование linux.
обратите внимание, что некоторые серверные демонические процессы (которые обычно должны быть уникальными) явно записывают свой pid в /var/run
, например,sshd
демон сервера записывает свой PID в текстовый файл /var/run/sshd.pid
). Вы можете добавить такую функцию в свои собственные серверные программы (закодированные на C, C++, Ocaml, Go, Rust или некоторые другие составлен язык).
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
#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;
}