在特定小时之间每 10 秒运行一次 bash 脚本



我有一个每 5 秒运行一次的脚本,是否可以在例如 CET 08:00 - 12:00 之间运行此脚本?

我以为我可以用 cron 工作来做到这一点,但不幸的是,这至少有 1 分钟。所以我正在考虑创建一个 cron 作业,它在 08:00 启动脚本,然后在 12:00 终止它,我认为这是最好的解决方案。

有人有任何意见吗?

#!/bin/bash
while true; do
python3 script.py
sleep 5;
done

正如Wiimm所指出的,他的回答只涵盖了"运行脚本,等待10秒,然后在8:00到12:00之间重复"。

我能想到几种方法:

A. 在 cron 中的 8:00 启动脚本,并让它检查何时完成

#!/bin/sh
END=$(date -d "12:00" +"%H * 60 + %M" | bc)
while [ $(date +"%H * 60 + %M" | bc) -lt $END ]; do
date >> /tmp/log.txt # replace this with your script 
sleep 10
done

解释:

  • date +"%H * 60 + %M" | bc计算自一天开始以来的分钟数。注意:bc 在这里用于处理会出错$(( $(date +"%H * 60 + %M") ))的前导零。
  • [ $(date +"%H * 60 + %M" | bc) -lt $END ]- 与结束时间进行比较

B.从 cron 启动它并使用信号处理程序来处理优雅的退出,使用 cron 结束它。

#!/bin/bash
echo $$ > /tmp/pid.txt
EXIT=
trap "echo 'Exiting' >> /tmp/log.txt; EXIT=yes" TERM
while [[ -z "$EXIT" ]]; do
date >> /tmp/log.txt # replace this with your script
sleep 10
done

crontab看起来像这样:

00 08 * * * /path/to/wrappers/script.sh
00 12 * * * kill $(cat /tmp/pid.txt)

解释:

  • echo $$ > /tmp/pid.txt- 保存 pid(您可能应该选择 另一个位置,适合您的系统)
  • trap "echo 'Exiting' >> /tmp/log.txt; EXIT=yes" TERM- 这将在术语时运行echo 'Exiting' >> /tmp/log.txt; EXIT=yes信号被接收到(TERM是kill发送的默认信号)。
  • while [[ -z "$EXIT" ]]; do- 在 EXIT 为空时重复
  • 这样做的好处是能够在需要时(而不仅仅是在 12:00)正常关闭脚本。

注意:两者的组合可能是最好的方法。

另外:请参阅 https://stackoverflow.com/a/53561843/939457 - 它详细介绍了如何通过 SystemD 运行它,但即使之前的脚本没有结束,也会每 10 秒运行一次脚本(如果我正确理解答案,我不熟悉 SystemD)

除了索林的解决方案。

while true; do
do_something 
sleep 10
done

这里的作业do_something不是每 10 秒执行一次 (!),而是每 10 秒执行一次加上执行do_something所需的时间。所以另一种选择是:

while true; do
sleep $((10-$(date +%s)%10))
do_something 
done

在这里,每次都执行作业do_something,当秒数为 0、10、20、30、40 或 50 之一时。唯一的缺陷:如果do_something运行模式超过 10 秒,则至少跳过一次执行。

我的睡眠解释:

DELAY=10
sleep $(( DELAY- $(date +%s) % DELAY))

$((...))进入数学模式。$(date +%s)返回自纪元以来的总秒数。% DELAY是一个模运算,因此结果介于 0 和排除 DELAY(本例中为 0..9)之间。DELAY-保证睡眠时间至少为 1 秒。

最新更新