2010-06-14 89 views
0

我想從PS fwaux找出給定父項的子進程(可能有更好的方法來做到這一點)。基本上,我有守護進程運行,可能或可能沒有任何特定時間運行的子進程。在另一個腳本中,我想檢查是否有任何子進程,如果有,請執行一些操作。如果沒有,則出錯。Perl解析ps fwaux輸出

ps fwaux | grep會給我看樹,但我不確定如何處理它。任何建議都會很棒。

回答

0

作爲一個更新,這是我結束了做(在bash ...)

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}; 

但退一步追蹤兒童的更大的問題:代替grepping進程表,孩子們使用PID文件應該跟蹤自己。 File::Pid可以幫助你。

+0

除非我誤解了某些內容,否則Pid文件不會幫助我,因爲我正在從完全獨立的腳本中檢查孩子。即script1創建孩子並將管理pid文件,script2如何知道如何處理pid文件? – 2010-06-14 18:11:40

+0

@Magic:文件包含孩子的pid,因此在管理腳本中,您只需檢查pid是否與仍在運行的進程相對應,因此您不必grep進程表。 – Ether 2010-06-14 18:18:25

+0

啊,這是有道理的。我猜這裏的問題是父應用程序是用Java編寫的,所以我不能訪問該pid。 (是的,我沒有開發這個) – 2010-06-14 18:51:34