1

いくつかの大きなアプリケーションをスタートアップスクリプトに入れたいです。それぞれの起動はI/Oを多用するタスクなので、混雑を避けるために、最初の起動が初期化されるまで、別の起動を延期したいと思います。

これらは、何らかの仕事をしてから存在するスクリプトとして機能していません。私はGUIアプリケーション(Firefox、Eclipseなど)について話しているので、アプリケーションが初期化の雑用を行ったことを知る唯一の方法は、ディスクI / Oを調べることです(間違っている場合は訂正してください)。

私は、出力を解析することで何かを接着できることを知っていますatop-しかし、何かが私に教えてくれます、たとえば、与えられた時間(たとえば3秒)にわたってサンプリングされたディスクIOが少ないときに戻るvmstat""ユーティリティのようなもっと簡単な解決策がなければなりませんwait-for-io-idle与えられたしきい値よりも(例えば10%)。

誰かがそのようなユーティリティについて知っていますか?

4

2 に答える 2

1

perealの回答に基づいて、すぐに使用できるスクリプトにパッチを適用しました。それを呼びましょうwait-for-disk-idle。この方法の欠点は、それ自体で初期化時間が必要になることです。「サンプル時間」を効果的にサンプリングしながら実行するには、「サンプル時間」の2倍の時間がかかります。これがiostatの制限です。

(はい、shではなくbashである必要があります)

#! /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
于 2013-03-26T09:40:16.940 に答える
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%未満の場合は終了します。

于 2013-03-26T07:46:47.467 に答える