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

以下脚本实现的功能是启动多个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


你可能感兴趣的:(shell,wait,eval,memtester)