如何运行脚本取决于差异停止时间

时间:2019-04-21 12:14:37

标签: linux bash date ubuntu time

您好,我编写了一个bash脚本,该脚本每24小时自动使用更新的参数运行一次python程序。第5天后,它将使用最后一个固定参数运行。

我想添加选项,以便如果系统已关闭6个小时以上,则脚本将从选项的第一天开始。如果不是,它将从最后一个状态继续。

当前,我仅将开始时间写入文件中。但是我不确定如何从该文件中读取时间字符串并用于计算开始和停止之间的时间差。

我只是试图将日期写入文件中。但是我不太确定如何在异常情况下读取和使用此值。

echo "$(date) $(ls -1 | wc -l)" >> starttime.txt
python3 startmeVtest.py 5 2 10
timeout 86400 ./start.sh
sleep 4
python3 startmeVtest.py 10 4 20
timeout 86400 ./start.sh
sleep 4
python3 startmeVtest.py 20 4 40
timeout 86400 ./start.sh
sleep 4
python3 startmeVtest.py 30 8 50
timeout 86400 ./start.sh
sleep 4
python3 startmeVtest.py 50 9 70
./start.sh

如果系统停止了少于6个小时,则只能执行最后一个脚本

sleep 4
python3 startmeVtest.py 50 9 70
./start.sh

2 个答案:

答案 0 :(得分:1)

请考虑在转储到starttime.txt的date命令中使用其他(或其他)格式。

代替:

echo "$(date) $(ls -1 | wc -l)" >> starttime.txt

考虑:

echo "$(date +%s) $(ls -1 | wc -l)" >> starttime.txt

上面的编辑将以纪元时间输出时间戳。纪元时间是指自纪元(通常是格林尼治标准时间1970年1月1日)以来的秒数。整数值将使您更容易比较6小时时差:

这里有一些代码来查看starttime.txt中的最后一个条目是否存在六个小时:

lastrun=$(tail -1 starttime.txt | awk '{print $1}')
currenttime=$(date +%s)
if [ $currenttime -gt $(( lastrun + 6 * 60 * 60 )) ] ; then
  # execute the system has STOP more than 6 hours logic
  :
else
  # execute the system has STOP less than 6 hours log
  :
fi

但是,您也可以通过仅查看starttime.txt上的时间戳并将其与6小时前的另一个文件进行比较来简化此操作。这是使用-ot测试的另一种方法。 -ot比测试更旧。将其应用于您的用例的方法如下:

touch -d "6 hours ago" 6hoursago
if [ starttime.txt -ot 6hoursago ] ; then
  # execute the "system has STOP more than 6 hours logic
  :
else
  # execute the "system has STOP less than six hours
  :
fi

答案 1 :(得分:0)

假设文件starttime.txt的最后一行始终包含开始时间,首先您可以读取开始时间并将其转换为秒数(自1970-01-01 00:00:00 UTC,请参见{{ 1}})。

man date

现在,您可以以秒为单位计算d1="$(date -d "$(cat starttime.txt | sed -nE '$ s/(.*) [0-9]+$/\1/p')" +%s)" now之间的时差。

d1

您可以使用此值进行决策。

diff="$(( $(date +%s) - d1 ))"

也许您可以通过将重复的命令移至函数中来简化脚本。因此,最终脚本将类似于以下内容。

if [[ $diff -gt 21600 ]]; then
    # action if diff is more than 6 hours
else
    # action if diff is less than 6 hours
fi