如何运行 iostat/vmstat/top/sar 直到所有后台进程完成?
How to run iostat/vmstat/top/sar till all the background processes are completed?
#!/bin/bash
# Start.sh
if [[ $# -ne 1 ]] ; then
echo 'Usage :<./Start N# >'
exit 1
fi
if [[ -ge 1 ]] ; then
for (( c=1; c<=; 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
在上面的脚本中我测量了虚拟机启动的时间,它写在test-online.sh脚本中。我想在每个后台进程(test-online.sh)完成时停止 /usr/bin/iostat -x 1 > result.txt 命令。
如果我们添加 "wait" 命令而不是“/usr/bin/iostat -x 1 > result.txt”,Start.sh 将等待后台进程。但是现在很迷茫,怎么办?
谢谢。
我曾经遇到过这个问题。因为我是 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
命令,并以 5
作为参数连续运行 vmstat
。输出写入 /var/tmp/mybench-DATE
目录。
再次,对于非 bash 实施表示抱歉。希望对你有帮助。
#!/bin/bash
# Start.sh
if [[ $# -ne 1 ]] ; then
echo 'Usage :<./Start N# >'
exit 1
fi
if [[ -ge 1 ]] ; then
for (( c=1; c<=; 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 中,我们检查是否有任何进程 Start.sh 的子进程,名为 test-online.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 等来获取系统统计信息。
#!/bin/bash
# Start.sh
if [[ $# -ne 1 ]] ; then
echo 'Usage :<./Start N# >'
exit 1
fi
if [[ -ge 1 ]] ; then
for (( c=1; c<=; 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
在上面的脚本中我测量了虚拟机启动的时间,它写在test-online.sh脚本中。我想在每个后台进程(test-online.sh)完成时停止 /usr/bin/iostat -x 1 > result.txt 命令。
如果我们添加 "wait" 命令而不是“/usr/bin/iostat -x 1 > result.txt”,Start.sh 将等待后台进程。但是现在很迷茫,怎么办?
谢谢。
我曾经遇到过这个问题。因为我是 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
命令,并以 5
作为参数连续运行 vmstat
。输出写入 /var/tmp/mybench-DATE
目录。
再次,对于非 bash 实施表示抱歉。希望对你有帮助。
#!/bin/bash
# Start.sh
if [[ $# -ne 1 ]] ; then
echo 'Usage :<./Start N# >'
exit 1
fi
if [[ -ge 1 ]] ; then
for (( c=1; c<=; 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 中,我们检查是否有任何进程 Start.sh 的子进程,名为 test-online.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 等来获取系统统计信息。