Python:如何等待磁盘活动消退?

时间:2014-01-18 19:36:58

标签: linux python-2.7 btrfs

Hegle Jensens' wrote a great SnapBtr script使用智能算法进行基于快照的备份,当可用空间变得稀缺时,选择要删除的旧备份。

不幸的是,BTRFS文件系统有一个特点,即在任何删除命令之后它不会立即释放磁盘空间;相反,它只是安排删除每个节点。释放磁盘空间的实际过程发生在后台,只有在完成之后,我们才知道有多少可用空间可用。

这就是为什么我想改进这个脚本,所以在删除备用子卷之后,它会等到没有硬盘驱动器活动才能获得实际的可用磁盘空间统计信息。

问题:知道周围有很多Python库,你知道任何可以返回的东西,我可以用它来获得%的硬盘活动饱和度吗?

如果这有帮助,我已经制作了一个Bash脚本wait-for-disk-idle.sh,它依赖于iostat来获取磁盘活动信息。但是我觉得调用外部Bash进程这么简单是非常低效且容易出错(如果没有安装iostat会怎么样?):

#! /bin/bash

USAGE="Usage: `basename $0` [-t sample time] [-p disk IO percent threshold] disk-device"

time=4
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 :(得分:1)

以下是我从脚本的(前)维护者那里得到的答案:

  

我不再使用SnapBtr.py脚本进行清理了   也许可以等待删除完成btrfs filesystem sync