別人已經寫了(TM)一些bash腳本,它分叉了很多子進程。它需要優化。但我正在尋找一種衡量問題「有多糟」的方法。如何計算分叉(子 - ?)進程的數量
我可以/如何得到一個計數,說明有多少個子進程被這個腳本總括/遞歸分叉?
這是一個什麼樣的存在,分叉的代碼看起來像一個簡化版本 - 一個窮人的grep的:
#!/bin/bash
file=/tmp/1000lines.txt
match=$1
let cnt=0
while read line
do
cnt=`expr $cnt + 1`
lineArray[$cnt]="${line}"
done < $file
totalLines=$cnt
cnt=0
while [ $cnt -lt $totalLines ]
do
cnt=`expr $cnt + 1`
matches=`echo ${lineArray[$cnt]}|grep $match`
if [ "$matches" ] ; then
echo ${lineArray[$cnt]}
fi
done
它需要的腳本20秒尋找$1
在1000線的投入。該代碼分叉了太多的子流程。在實際代碼中,使用grep
,cut
,awk
,sed
等在每條線上操作的管道較長(例如,progA | progB | progC
)。
這是一個忙碌的系統,其中有很多其他的東西正在進行,因此在腳本運行期間統計整個系統上有多少進程會對我有些用處,但我會更喜歡此腳本和後代所啓動的進程數。我想我可以分析腳本並自己計算腳本,但腳本很長並且相當複雜,所以如果可能的話,我只想用這個計數器進行調試。
澄清:
- 我沒有在任何特定時間(例如,通過
ps
)$$
下尋找的進程數量,但腳本的整個生命過程中運行的進程數。 - 我也沒有尋找這個特定示例腳本的更快版本(我可以這樣做)。我正在尋找一種方法來確定首先優化使用bash內置插件的30多個腳本中的哪一個。
哇,'陷阱 「((++叉))」 CHLD'。真的在那裏學到了東西。謝謝,祝你好運。 – shellter
@shellter:別忘了'set -m'!它不適用於它。 – TrueY
謝謝,我已經看到'set -o monitor'的引用並使用了它幾次。 – shellter