我有一个很长的自动化套件,可以运行并生成一个日志文件,例如:
Time, API, Min, Max, Average, Current, Invocation
2013-07-22 14:52:39, api1, 167.0, 167.0, 167.0, 167.0, 1
2013-07-22 14:52:39, api1, 167.0, 169.0, 168.0, 169.0, 2
...
...
测试完成后,我想通过sar(或nmon,但首先尝试sar)自动收集Unix机器统计信息。 sar命令是这样的:
sar -i 900 -f /var/log/sa/sa22 -s 10:00:00 -e 18:00:00
我已经有了一个Java类,它将SSH连接到任意数量的机器并运行从XML文件读取的静态命令。它会将输出保存到文件中以供以后解析。
我的困境是我想在测试期间自动运行sar命令(这当然会改变)。例如,我想从上面的日志文件中获取开始和结束时间,并使用这些日期运行sar。使用Unix shell,我可以按如下方式获取这些日期:
SECOND_LINE=`sed -n '2p' ${LOG_DIR}/${CURRENT_DATE}_results.txt`
START_DATE=`echo ${SECOND_LINE} | cut -c9-10`
START_TIME=`echo ${SECOND_LINE} | cut -c12-13,15-16`
LAST_LINE=`sed -n '$p' ${LOG_DIR}/${CURRENT_DATE}_results.txt`
END_DATE=`echo ${LAST_LINE} | cut -c9-10`
END_TIME=`echo ${LAST_LINE} | cut -c12-13,15-16`
我可以将它们传递到我的Java类并每次都形成sar命令,或者我可以查找并替换我的Java类从命令中读取的文本文件。但是,如果自动化套件运行多天或跨越另一个月,我不知道如何处理。
有没有更好的方法来实现我想要的或者我应该继续思考?我的最终目标是在测试的整个过程中我需要sar数据(CPU利用率,磁盘IO,内存使用率),这可能是几分钟或几天。
答案 0 :(得分:1)
我带了一个处理一些选项的基本脚本。这根本不是一个答案,只是一种过于宽泛而无法在评论中发布的方法:
start_day=22
end_day=$1
sar_path="/var/log/sa"
start_time=14
end_time=17
echo "start_day = $start_day - end_day = $end_day"
echo "start_time = $start_time - end_time = $end_time"
if [ $start_day -eq $end_day ]; then
echo "sar -i 900 -f $sar_path/sa$start_day -s $start_time:00:00 -e $end_time:00:00"
elif [ "$(($start_day + 1))" -eq $end_day ]; then
echo "sar -i 900 -f $sar_path/sa$start_day -s $start_time:00:00 -e 23:59"
echo "sar -i 900 -f $sar_path/sa$end_day -s 00:00:00 -e $end_time:00:00"
elif [ $start_day -gt $end_day ]; then
last_day=$(ls -1 $sar_path/sa[0-9]* | tail -1)
last_day=$(basename $last_day | grep -o [0-9]*)
echo "sar -i 900 -f $sar_path/sa$start_day -s $start_time:00:00 -e 23:59"
for i in $(seq $(($start_day +1)) $(($last_day)))
do
echo "sar -i 900 -f $sar_path/sa$i -s 00:00:00 -e 23:59:00"
done
for i in $(seq 1 $(($end_day -1)))
do
echo "sar -i 900 -f $sar_path/sa$i -s 00:00:00 -e 23:59:00"
done
echo "sar -i 900 -f $sar_path/sa$end_day -s 00:00:00 -e $end_time:00:00"
else
echo "sar -i 900 -f $sar_path/sa$start_day -s $start_time:00:00 -e 23:59"
for i in $(seq $(($start_day +1)) $(($end_day -1)))
do
echo "sar -i 900 -f $sar_path/sa$i -s 00:00:00 -e 23:59:00"
done
echo "sar -i 900 -f $sar_path/sa$end_day -s 00:00:00 -e $end_time:00:00"
fi
使用./file <last_day>
执行。
请注意,不考虑last_day
下个月的情况。还应检查当月的最后一天(最佳方式,ls -l /var/log/sa
)等。
尽管如此,我认为如果它能为您提供如此精美的日期解析,那么使用Java处理它会更好。
#same day
$ ./a 22
start_day = 22 - end_day = 22
start_time = 14 - end_time = 17
sar -i 900 -f /var/log/sa/sa22 -s 14:00:00 -e 17:00:00
#one day difference
$ ./a 23
start_day = 22 - end_day = 23
start_time = 14 - end_time = 17
sar -i 900 -f /var/log/sa/sa22 -s 14:00:00 -e 23:59
sar -i 900 -f /var/log/sa/sa23 -s 00:00:00 -e 17:00:00
#>1 day difference
$ ./a 27
start_day = 22 - end_day = 27
start_time = 14 - end_time = 17
sar -i 900 -f /var/log/sa/sa22 -s 14:00:00 -e 23:59
sar -i 900 -f /var/log/sa/sa23 -s 00:00:00 -e 23:59:00
sar -i 900 -f /var/log/sa/sa24 -s 00:00:00 -e 23:59:00
sar -i 900 -f /var/log/sa/sa25 -s 00:00:00 -e 23:59:00
sar -i 900 -f /var/log/sa/sa26 -s 00:00:00 -e 23:59:00
sar -i 900 -f /var/log/sa/sa27 -s 00:00:00 -e 17:00:00
# change of month
$ ./a 5
start_day = 22 - end_day = 5
start_time = 14 - end_time = 17
sar -i 900 -f /var/log/sa/sa22 -s 14:00:00 -e 23:59
sar -i 900 -f /var/log/sa/sa23 -s 00:00:00 -e 23:59:00
sar -i 900 -f /var/log/sa/sa24 -s 00:00:00 -e 23:59:00
sar -i 900 -f /var/log/sa/sa25 -s 00:00:00 -e 23:59:00
sar -i 900 -f /var/log/sa/sa1 -s 00:00:00 -e 23:59:00
sar -i 900 -f /var/log/sa/sa2 -s 00:00:00 -e 23:59:00
sar -i 900 -f /var/log/sa/sa3 -s 00:00:00 -e 23:59:00
sar -i 900 -f /var/log/sa/sa4 -s 00:00:00 -e 23:59:00
sar -i 900 -f /var/log/sa/sa5 -s 00:00:00 -e 17:00:00