Способ по крайней мере, проверить с помощью Баша в случае «ситуацию, как это, где я не знаю точно названия дочернего процесса», но знаю, что имя родительского процесса предполагается уникальный, можно использовать в bash
на основе ps
, grep
, sed
(удалить начальный пробел для небольших PIDs), tr
(сжать несколько consecuting пространства в один), и cut
:
$> cat foo_bar.sh
#! /bin/bash
sleep 120
$> ./foo_bar.sh &
[1] 89239
$> ps -eo pid,ppid,args|grep -e " $(ps -eo pid,args| grep foo_bar.sh| grep -v grep| sed s/^\ //g |cut -f 1 -d ' ') "|grep -v foo_bar.sh| sed s/^\ //g | tr -s ' ' | cut -f 1,3 -d ' '
89241 sleep
Таким образом, уникальное имя родительского процесса используется для определения родительского PID:
$> ps -eo pid,args| grep foo_bar.sh| grep -v grep| sed s/^\ //g |cut -f 1 -d ' '
89239
В этом оценивало в процессе суба ($(...)
) используются для ГРЭП правильной линии от другого ps
вызова, чтобы определить добившийся PID из child и name (без дополнительных аргументов и без предварительного знания имени childs.
Примечание - как обычно в Баш некоторые пробелы важны - дополнительное пространство в конце шаблона поиска:
... grep " $(ps -eo pid,args| grep foo_bar.sh| grep -v grep| cut -f 1 -d ' ') " ...
Это помогает избежать ложных срабатываний, например, когда родитель ПИД- 123, без дополнения с пространства это будет соответствовать много ИДПА, которые содержат эти цифры, как 1234, 12345, 1123, ...
Update (реагируя на комментарии): В случае, если родительский процессе a_mama
(разветвление от a_shvili
процесса к югу) и является только процесс с этим именем на машине, затем должно работать:
$> p_proc="a_mama"
$> ps -eo pid,ppid,args|grep -e " $(ps -eo pid,args| grep ${p_proc}| grep -v grep| sed s/^\ //g | cut -f 1 -d ' ') "|grep -v ${p_proc}| sed s/^\ //g | tr -s ' ' | cut -f 1,3 -d ' '
12346 a_shvili
Почему бы не использовать fork + exec вместо системного вызова? – sanjayk79