睡眠命令每隔一小时运行一次

睡眠命令每隔一小时运行一次

我需要你的一点帮助,我有一个脚本无法在 crontab 上安排。但我正在使用 sleep 命令。

我在使用 sleep 命令时遇到问题。

我的脚本花了 10 或 15 分钟才能完成(运行时),我使用 sleep(3600) 这意味着它又休眠一小时

但我的要求是我的脚本从 9:00、10:00... 开始,依此类推。由于我的脚本执行时间现在为 10 分钟(有所不同),并且在 sleep(3600) 命令之后,我的脚本下次运行从 10:10 而不是 10:00 开始

谁能帮助我如何纠正它,以便脚本每小时运行一次。

答案1

#!/bin/bash

function MY_CODE(){
    START_TIME_SECONDS=$(date +%s)
    <your code>
    END_TIME_SECONDS=$(date +%s)
    SCRIPT_RUN_TIME_IN_SECONDS=$((${END_TIME_SECONDS}-${START_TIME_SECONDS}))
    SLEEP_TIME=$((3600-${SCRIPT_RUN_TIME_IN_SECONDS}))
    sleep ${SLEEP_TIME}
}

MY_CODE()

答案2

由于您的目标是根据开始时间安排执行,因此您可以像这样安排每个脚本的执行:

#!bin/bash

function runattime {
    execution_time=$1
    delay=$(( $(date -d "$1" "+%s") - $(date "+%s") ))
    if [ $delay -le 0 ]; then
        echo "negative delay, probably due to incorrect date argument"
    else
        sleep $delay && ${@:2}
    fi
}


# One shot run
runattime 11:50 echo blah & 
runattime 11:51 echo bleh & 


# Everyday run
while true; do
    runattime 11:50 echo hola & 
    runattime 11:51 echo hello & 
    sleep 86400  # wait for next day and loop
done

要让脚本在后台运行,即使您已断开连接,您也可以使用 bash 中的 nohup 命令。

相关内容