如何运行iostat / vmstat / top / sar直到所有后台进程完成?

时间:2015-03-03 09:41:44

标签: linux bash scripting ubuntu-12.04 benchmarking

#!/bin/bash
# Start.sh
if [[ $# -ne 1 ]] ; then
    echo 'Usage :<./Start N# >'
    exit 1
fi

if [[ $1 -ge 1 ]] ; then
    for (( c=1; c<=$1; c++ ))
    do
        virsh start VM$c
        /usr/bin/time -f "%E" ./test-online.sh VM$c &
    done
else
    echo 'Give some positive number !!!'
fi
/usr/bin/iostat -x 1 > result.txt

在上面的脚本中,我将测量VM启动的时间,该启动时间写在test-online.sh脚本中。我想停止/ usr / bin / iostat -x 1&gt;每个后台进程(test-online.sh)完成时的result.txt命令。

如果我们添加&#34;等待&#34; Start.sh将等待后台进程命令而不是&#34; / usr / bin / iostat -x 1&gt;的Result.txt&#34 ;.但现在我很困惑,怎么做?

感谢。

2 个答案:

答案 0 :(得分:1)

我曾经遇到过这个问题。由于我是Python的大粉丝,我在python中实现了一个模块:https://gist.github.com/myaut/38e5d7cb813ed0db379c

这是一个小例子:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os, subprocess
import time
import bench

from datetime import datetime

cmd = "sleep 40"
benchdir = '/var/tmp/mybench-%s/' % datetime.now().strftime('%Y.%m.%d.%H.%M')
print 'Destination is %s' % benchdir

stats = [bench.statcmd('date', [], 5, False),
        bench.statcmd('vmstat', ['5']),
        ]
bench.run_test(cmd, stats, 'sleep', benchdir)

模块还支持Python类作为统计信息收集器,但我从示例中省略了它。此示例每5秒运行一次date命令,并以vmstat为参数连续运行5。输出写在/var/tmp/mybench-DATE目录中。

再次,抱歉非bash实现。希望它有所帮助。

答案 1 :(得分:0)

#!/bin/bash
# Start.sh
if [[ $# -ne 1 ]] ; then
    echo 'Usage :<./Start N# >'
    exit 1
fi

if [[ $1 -ge 1 ]] ; then
    for (( c=1; c<=$1; c++ ))
    do
        virsh start VM$c
        /usr/bin/time -f "%E" ./test-online.sh VM$c &
    done
else
    echo 'Give some positive number !!!'
fi
./kill_script.sh &
/usr/bin/sar -urdp 1 > result.txt 

在第一个脚本中,我们开始了很多后台进程,之后我们在iostart / sar / vmstat等之前调用kill_script.sh。在kill_script.sh中,我们检查是否有任何子进程,名为test- online.sh,进程Start.sh。如果没有进程则退出循环并杀死iostat / vmstat / sar等。

#!/bin/bash
#kill_script.sh
pid=`pgrep -o -x Start.sh`
out="a"
while true
do
    out=`ps --ppid $pid | grep time`
    sleep 1 
    echo $out
    if [ -z "$out" ]; 
    then 
        break;
    fi
done
kill $(pidof sar) > /dev/null 2>&1 

这里的假设是,我们是唯一一个使用该命令,即iostat / vmstat / sar等来获取系统统计数据。