【问题标题】:Gathering Unix machine stats in Java or Unix shell在 Java 或 Unix shell 中收集 Unix 机器统计信息
【发布时间】:2013-07-23 22:23:51
【问题描述】:

我有一个很长的自动化套件,它运行并生成一个日志文件,内容如下:

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、内存使用情况)。

【问题讨论】:

  • 要查看我是否正确理解,从晚上 11 点开始到凌晨 1 点结束的测试会有问题,因为sar -i 900 -f /var/log/sa/sa22 -s 23:00:00 -e 01:00:00 会失败。因此,只需添加两行:sar -i 900 -f /var/log/sa/sa22 -s 23:00:00 -e 23:59:00sar -i 900 -f /var/log/sa/sa23 -s 00:00:00 -e 01:00:00?
  • 是的,这就是问题所在。由于在 sar 我必须手动通过每一天,如果测试跨越 3 天,我需要智能地知道在第 1 天的时间 X 开始,收集第 2 天的所有 sar 数据,然后在第 3 天的时间 Y 结束。在 Java 中我可以做一些花哨的日期解析并智能地形成多个命令 - 但这是最​​好的方法吗?

标签: java shell unix scripting sar


【解决方案1】:

我附带了一个处理一些选项的基本脚本。这根本不是一个答案,只是一种过于宽泛而无法在 cmets 中发布的方法:

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 能够为您提供如此精美的日期解析,我认为使用 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

【讨论】:

  • 除了几个月的包装之外,这很好地解决了问题。也许使用那些花哨的 Java 日期类我可以处理,但对于我的需要,这很好。我只是不会运行将在下个月推出的测试。 :)
  • 哦!当您将其标记为已接受时,我想将其改进为滚动到下个月的情况。太好了,@Matt!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多