[疑问]如何使用 cron 让脚本每 7 分钟执行一次?

210 天前
 wuyadaxian
我的环境是 Ubuntu 22.04LTS 。
要求是从现在或者某个时间点开始,每 7 分钟执行一次 test.sh 脚本。
只能使用 crontab 来编写。
只是讨论,真正实现的时候肯定用 bash 或者其他语言脚本更方便实现。
15649 次点击
所在节点    程序员
162 条回复
hahahahahahahah
210 天前
crontab 没法实现
Puteulanus
210 天前
wuyadaxian
210 天前
@Puteulanus 换天的时候会混乱。按照上面代码,第一天 23:48,23:55 分执行,第二天 00:00,00:07 执行.-------实际第二天应该 00:02,00:09 执行
carity
210 天前
五楼方案不是挺好的吗
Puteulanus
210 天前
@wuyadaxian 确实,忘了考虑这点 😂
wuyadaxian
210 天前
@Puteulanus 穷举法其实我想过,前面 4 位,分/小时/天/月,每次进位都会出现问题。因为 60 分/24 小时/28 天 or29 天 or30 天 or31 天/12 月 ,以上数字均不能被 7 整除形成循环。全部穷举后如果每年都是 365 天,7 年可以循环一次。但是实际上每 4 年有一次有闰年,也就是每 28 年才能穷举一次所有时间。
busier
210 天前
@wuyadaxian "都上 sh ,不如直接 sh 内调用,然后 sleep 420 。循环就好。所以只是在讨论。实际用其他脚本语言会更快。"

不可靠!脚本运行命令以及等待命令返回都是要消耗时间的,并且这个时间还不确定。

你可以每 sleep 420 将系统 RTC 时间写一下 log ,累积起来时间偏差会越来越大!

所以应该通过不断(例如每 0.2s)读取 UNIX 时间戳方式判断是否经过了 7 秒。而不能去 sleep 7 秒。
wuyadaxian
210 天前
@busier 感谢提醒,收到。确实 sleep 是在调用之后,会累计增加前面一句调用时间。
wudanyang
210 天前
用 at 命令
每次在脚本执行的时候先执行一下 at 命令

```
echo "/path/to/myscript.sh" | at now + 7 minutes

你的逻辑
```
busier
210 天前
@wuyadaxian 你前面的,涉及时间计算的问题统一用 UNIX 时间戳进行。彻底解决各种烦恼!
emor
210 天前
用 5 楼的方式,每分钟扫描一次,获取时间戳,t = 时间戳毫秒/11000/60 ,再用对 t 对 7 取余
wuyadaxian
210 天前
@Puteulanus 等等,我发现一周可以被 7 整除,而且一周这个单位不会被前面 4 个所影响。所以使用最后一个周作为标记来进行穷举即可。
snipking
210 天前
@wuyadaxian 不是还有星期这一位吗?考虑到跨天,写 49 条也能穷举了
wuyadaxian
210 天前
@Puteulanus 我们只需要每天穷举 7 条 cron ,每周 7 天穷举 49 条 cron 就能实现。如果需要增加偏移量,只需要更改周的位置即可。
skyrim61
210 天前
@dapang1221 半个小时过去了
suyuyu
210 天前
@dapang1221 38 分钟了怎么说
wps353
210 天前
systemd.timer 应该可以
mohumohu
210 天前
#!/bin/sh

start_time=$(date +%s)

while true; do
current_time=$(date +%s)

elapsed_time=$((current_time - start_time))

if [ $elapsed_time -ge 420 ]; then
./myscript.sh

start_time=$(date +%s)
fi

sleep 1
done
mohumohu
210 天前
* * * * * ( [ -f /tmp/timestamp ] || date +\%s > /tmp/timestamp ) && [ $(( $(date +\%s) - $(cat /tmp/timestamp) )) -ge 420 ] && ( ./myscript.sh && date +\%s > /tmp/timestamp )
wuyadaxian
210 天前
@mohumohu 后面 command 部分能接这种复杂的命令集吗?我尝试了下 cron 没运行(不知道是不是我的问题),但是直接输入后面的 command 是可以运行的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1045433

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX