简单的计时器,用于测量操作完成的秒数

时间:2010-10-01 15:19:50

标签: bash freebsd

我运行自己的脚本,每晚将数据库转储到文件中 我想计算转储每个数据库所需的时间(以秒为单位),所以我试图编写一些函数来帮助我实现它,但我遇到了问题。

我不是bash中脚本编写的专家,所以如果我做错了,请说出来,理想情况下建议替代方案。

这是脚本:

#!/bin/bash

declare -i time_start

function get_timestamp {
        declare -i time_curr=`date -j -f "%a %b %d %T %Z %Y" "\`date\`" "+%s"`
        echo "get_timestamp:" $time_curr
        return $time_curr
}

function timer_start {
        get_timestamp
        time_start=$?
        echo "timer_start:" $time_start
}

function timer_stop {
        get_timestamp
        declare -i time_curr=$?
        echo "timer_stop:" $time_curr
        declare -i time_diff=$time_curr-$time_start

        return $time_diff
}

timer_start
sleep 3
timer_stop
echo $?

代码应该是非常不言自明的。 echo命令仅用于调试 我希望输出是这样的:

$ bash timer.sh
get_timestamp: 1285945972
timer_start: 1285945972
get_timestamp: 1285945975
timer_stop: 1285945975
3

现在不幸的是,情况并非如此。我得到的是:

$ bash timer.sh
get_timestamp: 1285945972
timer_start: 116
get_timestamp: 1285945975
timer_stop: 119
3

如您所见,本地var time_curr从命令获取的值是有效的时间戳,但返回此值会使其更改为0到255之间的整数。

有人可以向我解释为什么会这样吗?

PS。这显然只是我的计时器测试脚本,没有任何其他逻辑。


更新 为了完全清楚,我希望这是一个非常类似于this one的bash脚本的一部分,我想测量每个循环周期。

除非我可以使用time执行此操作,否则请提出解决方案。

4 个答案:

答案 0 :(得分:21)

您无需执行所有操作。只需在shell中运行time <yourscript>

答案 1 :(得分:3)

$?用于保存命令的退出状态,并且只能保存0到255之间的值。如果传递超出此范围的退出代码(例如,在调用{{1}的C程序中}),shell仍然会收到该范围内的值,并相应地设置exit(-1)

作为一种解决方法,您可以在bash函数中设置不同的值:

$?

答案 2 :(得分:0)

我相信你应该能够使用现有的“时间”功能。

更新问题后: 这是来自链接的脚本,它正在进行for循环。

# dump each database in turn
for db in $databases; do
    echo $db
    $MYSQLDUMP --force --opt --user=$USER --password=$PASSWORD
    --databases $db > "$OUTPUTDIR/$db.bak"
done

您可以将循环的内部部分提取到一个新脚本中(称之为dump_one_db.sh) 并在循环中执行此操作:

  # dump each database in turn
    for db in $databases; do
        time dump_one_db.sh $db
    done

确保将数据库名称的时间输出写入某个文件。

答案 3 :(得分:0)

这种情况正在发生,因为返回代码需要介于0到255之间。您不能返回任意数字。如果您继续拒绝使用内置time函数并自行滚动,请更改函数以回显其标记并使用流程扩展($())来获取值。

相关问题