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

2024-05-30 16:47:00 +08:00
 wuyadaxian
我的环境是 Ubuntu 22.04LTS 。
要求是从现在或者某个时间点开始,每 7 分钟执行一次 test.sh 脚本。
只能使用 crontab 来编写。
只是讨论,真正实现的时候肯定用 bash 或者其他语言脚本更方便实现。
18949 次点击
所在节点    程序员
162 条回复
storyxc
2024-05-31 09:29:50 +08:00
@superrichman #12 学到了
hero1874
2024-05-31 09:53:59 +08:00
还是得写脚本吧 cron 不行
p1gd0g
2024-05-31 09:55:17 +08:00
歪个楼,不能改 sh 那能不能套一层 sh 呢。我看评论里的 cron 未免也太复杂了
josephok
2024-05-31 09:58:10 +08:00
X-Y problem
josephok
2024-05-31 09:58:55 +08:00
V2IEX
2024-05-31 10:12:49 +08:00
cron 每分钟执行一次,代码里记录执行次数 n ,if(n%7)==0 执行代码
EndlessMemory
2024-05-31 10:20:52 +08:00
穷举居然是最可靠的
usdc
2024-05-31 10:35:40 +08:00
没想到真能学到知识
CHTuring
2024-05-31 10:51:36 +08:00
啊,以前从没想过 cron 的这种知识,都是网页生成一个就用了。
Goooooos
2024-05-31 10:51:47 +08:00
#!/bin/bash

function is_execute(){
echo 1 >> exec_count.log
lines="$(cat exec_count.log| wc -l)"
if [ "$lines" -eq "7" ]; then
cat /dev/null > exec_count.log
return 0
else
return 1
fi
}

is_execute
rs="$?"


笨方法,返回 0 就执行,1 就退出脚本。每分钟一次
dna1982
2024-05-31 11:04:22 +08:00
什么年代了
早就该换 systemd 了
mingwiki
2024-05-31 11:10:11 +08:00
@dna1982 #111 systemd 太大了,我就喜欢 openrc 这种,只不过定时任务这块我不用 crontab,我倾向于写 python 脚本。
baoshijiagong
2024-05-31 11:12:08 +08:00
@josephok Good!

如果不为解决实际问题,只是讨论 cron 用法,只考虑修改 crontab ,只能穷举, 7 * 7 条,如上面提及的 AI 回复的穷举。还可以优化一下,比如第一位可以改成类似 5-59/7 ,不用写一大堆。

那么引申一下,如果是 2, 3, 5, 7 以外的质数,比如 11 ,就没办法做到了。


如果是为解决实际问题,有很多 easy 的办法。

如 @josephok 所说,尽量少 X-Y 。OP 的第一行写道 “我的环境是 Ubuntu 22.04LTS 。”,那么给人的感觉是抛出一个实际待验证的问题,尽量表达好自己的意思,少误导你想求助的人,到底是真的抽象问题的探讨,还是要解决实际问题,如果是前者,最好是改成类似这样:

是否可以只在 crontab 里实现,每 7 分钟执行一次命令?
y1y1
2024-05-31 11:16:50 +08:00
加一层或者穷举
dna1982
2024-05-31 11:23:28 +08:00
@mingwiki #112 什么系统不带 systemd 啊。我用的 Debian ( 11 还是 12 忘了)连 SSH 服务都是 systemd 的了。
Huelse
2024-05-31 11:28:30 +08:00
https://tool.lu/crontab/ 验证 `*/7 * * * *`确实不行,到整点就不对了,
换个思路,每分钟执行,在/tmp 存下时间,如果距离上次执行大于等于 7 分钟了就执行 sh
wuyadaxian
2024-05-31 12:04:20 +08:00
@baoshijiagong 因为之前查了资料,有系统环境差异。
比如#51 楼提到的,macOS 下 crontab 和 linux 下 crontab 就可能会不一样。
而且有些特别的 arm 芯片上的特定版本 os 下的 crontab 也可能有差异。
我考虑的是尽可能说出相关环境,用于实践测试。
wuyadaxian
2024-05-31 12:12:00 +08:00
@baoshijiagong
你可以把它看做一道面试/考试题。
你进入正在一个面试/考试,电脑画面已经打开了 crontab -e 。
考题是每 7 分钟执行一次 test.sh
已经确认 user 对 test.sh 有读写运行权限。
一旦你关闭这个编辑界面面试/考试即结束。
-----------------------------------------------------
以上是我瞎编的。
我并不是想解决任何实际问题。
毕竟实际问题上不会存在这么奇葩的要求,一般 */5 * * * * command 就够用了。
wuyadaxian
2024-05-31 12:35:09 +08:00
@noyle #96 it works!!!!
感谢#96 楼,需要注意#96 楼提到的两点问题。

我使用下面的代码:
* * * * * [ $(($(date +\%s) / 60 \% 1 )) -eq 0 ] && ( /etc/test.sh )
ww2000e
2024-05-31 12:37:32 +08:00
这种问大模型就行。。

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

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

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

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

© 2021 V2EX