我需要你的一点帮助,我有一个脚本无法在 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 命令。