我有一个每 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 秒。