他の誰かが、非常に多くのサブプロセスをフォークする bash スクリプトを (TM) 書きました。最適化が必要です。しかし、問題が「どれほど悪いか」を測定する方法を探しています。
このスクリプトによって全体として/再帰的に分岐されたサブプロセスの数を示すカウントを取得するにはどうすればよいですか?
これは、既存の fork コードがどのように見えるかを単純化したバージョンです - 貧乏人の 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
$1
スクリプトが 1000 行の入力を探すのに 20 秒かかります。このコードはあまりにも多くのサブプロセスをフォークしています。実際のコードでは、、、などprogA | progB | progC
を使用して各行で動作する長いパイプ ( など) があります。grep
cut
awk
sed
これは、他にも多くの処理が行われているビジー状態のシステムです。そのため、スクリプトの実行中にシステム全体でフォークされたプロセスの数を数えることは、ある程度は役に立ちます。このスクリプトと子孫によって開始されたプロセス。そして、スクリプトを分析して自分でカウントすることもできると思いますが、スクリプトは長くてかなり複雑なので、可能であれば、デバッグ用にこのカウンターを装備したいと思います。
明確にするために:
$$
任意の時点でのプロセスの数を探しているのではなく(たとえば、を介してps
)、スクリプトの存続期間全体で実行されるプロセスの数を探しています。- また、この特定のサンプル スクリプトのより高速なバージョンを探しているわけでもありません (それは可能です)。30 以上のスクリプトのどれを最初に最適化して bash ビルトインを使用するかを決定する方法を探しています。