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

2024-05-30 16:47:00 +08:00
 wuyadaxian
我的环境是 Ubuntu 22.04LTS 。
要求是从现在或者某个时间点开始,每 7 分钟执行一次 test.sh 脚本。
只能使用 crontab 来编写。
只是讨论,真正实现的时候肯定用 bash 或者其他语言脚本更方便实现。
18940 次点击
所在节点    程序员
162 条回复
wuyadaxian
2024-05-30 19:26:33 +08:00
* * * * * [[ $(($(date +'%s / 60 % 1 '))) -eq 0 ]] && /etc/test.sh
我将%7 改为%1 ,这样理论上每分钟就会运行一次 test.sh 。但是没有运行
wuyadaxian
2024-05-30 19:30:51 +08:00
@brant2ai 见楼上,我已经正确赋予了用户对 test.sh 的读写运行权限。
另外如果我改为* * * * * /etc/test.sh 是可以正常每分钟运行的。
wuyadaxian
2024-05-30 19:32:08 +08:00
@brant2ai 同时,直接在窗口运行 [[ $(($(date +'%s / 60 % 1 '))) -eq 0 ]] && /etc/test.sh
是没问题的,因为左边部分永远为真,右边始终会执行。
lovelylain
2024-05-30 19:32:51 +08:00
@wuyadaxian 那就写到脚本里面呗,每分钟执行 1 次脚本,脚本里[[ $(($(date +'%s / 60 % 7 '))) -eq 0 ]] || exit
wuyadaxian
2024-05-30 19:38:01 +08:00
@brant2ai 如果你那边服务器可以运行,请告诉我以下你服务器的系统和版本号。我去装一个测试下,看是不是只有 ubuntu 不行。
maladaxia
2024-05-30 19:41:51 +08:00
yangxiaopeipei
2024-05-30 19:49:29 +08:00
执行完 sleep 7*60
brant2ai
2024-05-30 19:54:47 +08:00
@wuyadaxian #83 我也试试,crontab 好像是不太行,我改了几次命令,好像还是执行不了
director
2024-05-30 19:55:28 +08:00
每分钟跑一次,在程序里判断时间点/7 的余数为某个值就执行
momomirage
2024-05-30 19:55:55 +08:00
一周有 7 天

所以用多(但是有限)个 cron 表达式合起来应该可以每 7 分钟一次
wuyadaxian
2024-05-30 19:59:07 +08:00
@brant2ai #88 估计和平台有关 。
#51 楼我找到一个文章,声称使用 macOS 可以这么运行。
但是没有发现 linux 平台下的案例。
zzhaolei
2024-05-30 20:30:52 +08:00
不会是面试题吧?要么加一层,然后写入上次执行的时间,如果也不能写文件,那就放弃吧,纯 crontab 肯定实现不了
feedcode
2024-05-30 21:01:29 +08:00
换个思路
systemd-run --on-boot=30 --on-unit-active=420 bash /path/script.sh

Running timer as unit: run-r2f2f454d18944d79af858a4be4f48cd5.timer
Will run service as unit: run-r2f2f454d18944d79af858a4be4f48cd5.service

如果测试 ok,把对应的 timer 和 service 从/run/systemd/transient/ move 到/etc/systemd/system 做持久化
Ipsum
2024-05-30 22:43:41 +08:00
最简单就是每分钟运行,然后脚本获取当前时间,分钟能被 7 整除就运行。否则就退出。如果是其他时间 60 能被 n 整除可以用*/n
dxdydz
2024-05-30 23:25:00 +08:00
我想了个双脚本思路,大致内容如下
script_a.sh:
#!/bin/bash
# 使用 at 命令在 7 分钟后执行脚本 b
#run task
echo "/path/to/script_b.sh" | at now + 7 minutes
script_b.sh:
#!/bin/bash
# 使用 at 命令在 7 分钟后执行脚本 a
#run task
echo "/path/to/script_a.sh" | at now + 7 minutes
noyle
2024-05-31 00:43:16 +08:00
@wuyadaxian

`[[ $(($(date +'%s / 60 % 7 '))) -eq 0 ]] &&`
这句在 cron 里有几个问题:
1 ,`[[`是 bash 扩展,不是命令,所以在 cron 的 shell 环境里报错,改用`[ ... ]`或者`test ...`应该就没问题了。[1]
2 ,字面`%`在 cron 里应该用`\`转义。[2]

所以,下面这条应该可以:
`*/1 * * * * root [ $(($(date +'\%s / 60 \% 7 '))) -eq 0 ] && ( echo "CRON RUN" | logger )`

[1] https://stackoverflow.com/a/47576482/6681141
[2] https://serverfault.com/questions/274475/escaping-double-quotes-and-percent-signs-in-cron
ZeekChatCom
2024-05-31 06:22:50 +08:00
写复杂命令在 cron 里面可以实现,但是这个和套一层 shell 有啥本质区别?无非是把外层的判断写在了 cron 行上面了而已
james122333
2024-05-31 08:56:52 +08:00
直接写 bash 脚本 cron 本来就是用在规律用途 也比较鸡肋 因为 bash 本身就能实现 cron 的功能
有准确的用法 至于 sleep 为何会不准因为是外部命令 启动要时间 用久会有大误差 这需求有不只一种实现方法
systemd? 垃圾东西就不要用了
hackerwgf
2024-05-31 09:14:57 +08:00
哎,就喜欢这样的 v2
asche910
2024-05-31 09:20:03 +08:00
用脚本吧,sleep ( 7 * 60 ),然后异步执行

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

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

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

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

© 2021 V2EX