【发布时间】:2013-07-17 02:39:59
【问题描述】:
其他人编写了(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
脚本在 1000 行输入中查找 $1 需要 20 秒。这段代码分叉了太多的子流程。在实际代码中,使用grep、cut、awk、sed 等在每一行上运行更长的管道(例如progA | progB | progC)。
这是一个繁忙的系统,还有很多其他事情要做,所以在脚本运行期间计算整个系统上分叉的进程数对我来说会有一些用处,但我更喜欢此脚本和后代启动的进程计数。而且我想我可以自己分析脚本并计算它,但是脚本很长而且相当复杂,所以如果可能的话,我只想用这个计数器来调试它。
澄清一下:
- 我不是在任何给定时间(例如通过
ps)查找$$下的进程数,而是在脚本的整个生命周期内运行的进程数。 - 我也不是在寻找这个特定示例脚本的更快版本(我可以做到)。我正在寻找一种方法来确定首先要优化 30 多个脚本中的哪一个以使用 bash 内置函数。
【问题讨论】:
标签: bash process subprocess