2010-06-14 4 views
0

Я пытаюсь выяснить дочерние процессы данного родителя из ps fwaux (возможно, это лучший способ сделать это). В принципе, у меня есть демоны, которые могут или не могут иметь дочерний процесс, запущенный в любой момент времени. В другом скрипте я хочу проверить, есть ли какие-либо дочерние процессы, и если что-то делать. Если нет, ошибка.Perl parsing ps fwaux output

ps fwaux | grep покажет мне дерево, но я не совсем уверен, что с ним делать. Любые предложения были бы замечательными.

ответ

0

В качестве обновления, это то, что я в конечном итоге делает (в Баш ...)

while : 
do 
     # find parent ids 
     PIDS="`ps -eao bsdtime,pid,command | egrep -v egrep | egrep 'processname' | awk '{print $2}'`" 
     count=0 
     # loop through ppids and look for children 
     for j in ${PIDS} 
     do 
       #echo "Parent process = $j" 
       CPID="`ps -ef | awk '$3 == J {print $2}' J=$j`" 
       for i in ${CPID} 
       do 
         #echo "Child process = $i" 
         let count++ 
       done 
     done 

Тогда, если число> 0, есть дочерние процессы.

2

можно разобрать результаты вызова Proc::ProcessTable:

use Proc::ProcessTable; 

my $processes = Proc::ProcessTable->new(enable_ttys => 0); 
my @children = grep { $_->cmndline =~ /some_pattern_matching_your_children/ } @{$processes->table}; 

# or: 
my @children = grep { $_->ppid == $parent_pid } @{$processes->table}; 

Но отступая к большей проблеме отслеживания детей: вместо оглавления таблицы процессов, дети должны отслеживать себя с помощью PID-файлов. File::Pid может помочь вам в этом.

+0

Если я что-то не понимаю, файлы Pid мне не помогут, так как я проверяю детей на совершенно отдельный скрипт. То есть script1 создает дочерний элемент и управляет файлом pid, как скрипт2 знает, что делать с pid-файлом? –

+0

@Magic: Файл (ы) содержит дочерние элементы дочерних элементов, поэтому в вашем скрипте управления вы просто проверяете, соответствуют ли pid процессам, которые все еще работают, поэтому вам не нужно grep таблицу процессов. – Ether

+0

А это имеет смысл. Я думаю, проблема в том, что родительское приложение написано на Java, поэтому у меня не будет доступа к pid. (да, я этого не развил) –