我想從PS fwaux找出給定父項的子進程(可能有更好的方法來做到這一點)。基本上,我有守護進程運行,可能或可能沒有任何特定時間運行的子進程。在另一個腳本中,我想檢查是否有任何子進程,如果有,請執行一些操作。如果沒有,則出錯。Perl解析ps fwaux輸出
ps fwaux | grep會給我看樹,但我不確定如何處理它。任何建議都會很棒。
我想從PS fwaux找出給定父項的子進程(可能有更好的方法來做到這一點)。基本上,我有守護進程運行,可能或可能沒有任何特定時間運行的子進程。在另一個腳本中,我想檢查是否有任何子進程,如果有,請執行一些操作。如果沒有,則出錯。Perl解析ps fwaux輸出
ps fwaux | grep會給我看樹,但我不確定如何處理它。任何建議都會很棒。
作爲一個更新,這是我結束了做(在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,則子進程。
你可以解析調用的結果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可以幫助你。
除非我誤解了某些內容,否則Pid文件不會幫助我,因爲我正在從完全獨立的腳本中檢查孩子。即script1創建孩子並將管理pid文件,script2如何知道如何處理pid文件? – 2010-06-14 18:11:40
@Magic:文件包含孩子的pid,因此在管理腳本中,您只需檢查pid是否與仍在運行的進程相對應,因此您不必grep進程表。 – Ether 2010-06-14 18:18:25
啊,這是有道理的。我猜這裏的問題是父應用程序是用Java編寫的,所以我不能訪問該pid。 (是的,我沒有開發這個) – 2010-06-14 18:51:34