如何判断多个 shell 脚本的持续时间是否超过一小时?

如何判断多个 shell 脚本的持续时间是否超过一小时?

我正在尝试检查运行时间,如果超过一个小时,则返回错误,但代码间歇性地返回误报。在 中firstRun.sh,我将时间读为:

export START_H=`date +%H`
export START_M=`date +%m`

并在secondRun.sh我检查时间如下:

CURRENT_H=`date +%H`
CURRENT_M=`date +%M`
TIME=`expr $CURRENT_H - $START_H`

if [ $TIME -gt 0 ] && [ $START_M -lt $CURRENT_M ]; then
    echo "boot time is more than an hour"
fi

谁能帮我找出问题可能出在哪里?在 if 语句中使用&&和使用有什么区别吗?-a或者使用[]和之间有什么区别()

答案1

export BOOT_TIME=$(date +%s)
current=$(date +%s)
(( current - BOOT_TIME >3600 ))  && echo "More than an hour"

%s返回自 1970-01-01 00:00:00 UTC 以来的秒数。

讨论:为什么秒更好

例如,假设开始(引导)时间为 23:00,当前时间为 00:23。那么,$TIME是负数,这将不起作用:

if [ $TIME -gt 0 ] && [ $START_M -lt $CURRENT_M ]; then
    echo "boot time is more than an hour"
fi

同样,假设开始时间为 12:03,当前时间为 14:00。然后,上面的方法也不起作用,这次是因为分钟测试。

答案2

这里有两个问题

  1. 在单独的语句中设置当前时间的小时和分钟时,存在潜在的竞争条件(考虑小时顶部的分钟滚动)。

  2. 在您的第一个脚本片段中,您使用了%m几分钟(但这实际上是几个月)。在你的第二个你正在使用%M.

我的建议是,你最好HHMM=$(date +'%H %M')将其分成两部分。更好的是,将时间视为自纪元以来的秒数的组合值SECONDS=$(date --utc +'%s'),并允许每小时包含 3600 秒。 (该--utc部分避免了每年两次的当地时间变化。)

相关内容