我想将一些大型应用程序放入我的启动脚本中。由于启动每一个都是I / O繁重的任务,为了避免拥塞,我想推迟启动另一个,直到第一个初始化。
这些不是有效的脚本,然后存在。我说的是GUI应用程序(比如Firefox,Eclipse),它们不会退出,所以知道应用程序完成初始化工作的唯一方法是(如果我错了,请纠正我)检查磁盘I / O.
我知道我可以通过解析来自atop
的输出或甚至更好地使用vmstat
来粘贴一些内容 - 但有些事情告诉我,必须有一个更简单的解决方案,例如“wait-for-io-idle
“在给定时间(例如3秒)内对磁盘IO进行采样时返回的实用程序小于给定阈值(例如10%)。
有谁知道这样的效用?
答案 0 :(得分:1)
根据pereal的回答,我修补了一个可以使用的脚本。我们称之为wait-for-disk-idle
。这种方法的缺点是它需要自己的初始化时间。在有效采样“采样时间”的同时,执行两次“采样时间”。这是iostat的限制。
(是的,一定是bash,而不是sh)
#! /bin/bash
USAGE="Usage: `basename $0` [-t sample time] [-p disk IO percent threshold] disk-device"
time=3
percent=10
# Parse command line options.
while getopts ":t:" OPT; do
case "$OPT" in
t)
time=$OPTARG
;;
:)
# getopts issues an error message
echo "`basename $0` version 0.1"
echo $USAGE >&2
exit 1
;;
\?)
# getopts issues an error message
echo "`basename $0` version 0.1"
echo $USAGE >&2
exit 1
;;
esac
done
while getopts ":p:" OPT; do
case "$OPT" in
p)
percent=$OPTARG
;;
:)
;;
\?)
# getopts issues an error message
echo "`basename $0` version 0.1"
echo $USAGE >&2
exit 1
;;
esac
done
# Remove the switches we parsed above.
shift `expr $OPTIND - 1`
# We want at least one non-option argument.
# Remove this block if you don't need it.
if [ $# -eq 0 ]; then
# getopts issues an error message
echo "`basename $0` version 0.1"
echo $USAGE >&2
exit 1
fi
# echo percent: $percent, time: $time, disk: $1
while [[ $(iostat -d -x $time 2 $1 |
sed -n 's/.*[^0-9]\([0-9][0-9]*\),[^,]*$/\1/p' | tail -1) > $percent
]]; do
# echo wait
done
答案 1 :(得分:0)
这不是您正在寻找的理想选择,但仍然是一个解决方案:
while [[ $(iostat -d -x 3 2 sda |
sed -n 's/.*[^0-9]\([0-9][0-9]*\),[^,]*$/\1/p' | tail -1) > 10
]]; do
echo wait
done
对sda的利用率进行3秒的采样,如果低于10%则退出。