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