您的位置:首页 > 运维架构 > Shell

shell之使用eval模拟一维数组保存进程pids,并调用wait等待所有进程执行完返回

2014-09-10 14:53 531 查看
以下脚本实现的功能是启动多个memtester进程测试DDR的稳定性,并在后台运行;由于sh Shell不支持数组类型的数据类型,导致在while循环中不能把“$i”当索引使用数组。在这种情况下,使用eval pid$i=$!来保存启动的进程ID(该命令执行结果为:pid1=ID1, pid2=ID2, ......); 所有的memtester进程启动后,调用uwait()函数,同样使用eval wait
\$pid$i等待所有memtester进程的退出。

eval命令将会首先扫描命令行进行所有的替换,憨厚再执行命令。该命令使用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时候被称为复杂变量。所以eval可以模拟一维数组,正如脚本中所使用,同样也可以模拟二维数组。

wait命令等待制定的pids进程执行完后返回。

#!/bin/sh

#$1 - size of memory region
#$2 - loops
#$3 - number of memtester process
umemfree()
{
cat /proc/meminfo | grep MemFree
rm /media/sdcard/memtester*.log 2>/dev/null
}

umemtester()
{
i=1
while [ "$i" -le $3 ]
do
memtester $1 $2 1>/dev/null 2>/media/sdcard/memtester"$i".log &
eval pid$i=$!
i=$((i+1))
done
}

uwait()
{
i=1
while [ "$i" -le $1 ]
do
eval wait \$pid$i
cat /media/sdcard/memtester"$i".log
i=$((i+1))
done
}

# Main
./test_mpeg4_dec.sh &
vsppid=$!
umemfree
date
umemtester $1 $2 $3
uwait $3
date
kill -1 $vsppid
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐