1
MrUser 2019-12-24 16:42:17 +08:00
每 5 分种执行一次 A 脚本,在 A 脚本里判断是不是第 65N 次。
|
2
lihongjie0209 2019-12-24 16:43:05 +08:00
每分钟执行一次, 判断和上次执行时间是否超过 65min(每次执行需要写入执行时间)
|
3
victor 2019-12-24 16:44:34 +08:00
*/5 */1 * * *
|
4
geekvcn 2019-12-24 16:45:35 +08:00
用 shell 比较方便,crontab 每小时会重置计时
|
6
yoshiyuki 2019-12-24 16:47:05 +08:00
没有特别好的写法,cron 本身不支持每 65 分钟这种语法
真要特别精准的话,需要一个个时间点写下来,00:00、01:05、etc 这样 |
7
feigle 2019-12-24 16:54:00 +08:00 1
还有个笨办法,把脚本复制 12 份,每一份每天执行两次,每份之间间隔 65 分钟
|
8
shengchao OP 好吧 得到结论,crontab 真的挫
|
9
FS1P7dJz 2019-12-24 16:56:09 +08:00 3
技术上的实现如果扭曲
最好先反思一下业务上逻辑是不是存在问题... 65 分钟这种奇怪的要求,往往不应该让系统去做,应该是开发那边做 |
10
sqdxxx 2019-12-24 17:00:10 +08:00
sleep(65*60)
|
12
zbl430 2019-12-24 17:20:14 +08:00
http://qqe2.com/cron 这个可以测试,但是无法应该实现
|
14
maichael 2019-12-24 17:31:41 +08:00
弄个每小时执行一次的,然后脚本里面先睡 5 分钟。
|
15
b821025551b 2019-12-24 17:35:45 +08:00
|
16
b821025551b 2019-12-24 17:36:32 +08:00
@maichael #14
那也还是每 60 分钟一次,而不是 65 |
19
caryqy 2019-12-24 17:41:02 +08:00
5 */1 * * *
a++ if a%2 == 1 then run ... fi |
20
caryqy 2019-12-24 17:43:50 +08:00
缺点 需要额外的一个文件保存计数值
|
21
caryqy 2019-12-24 17:47:36 +08:00
不对,我的方法错的
|
23
JJstyle 2019-12-24 17:49:52 +08:00 via iPhone
1/65 * * * *,难道不是这个吗?
|
24
momocraft 2019-12-24 17:51:32 +08:00
寫一個腳本生成 100 次間隔 65 分鐘的 crontab
然後用 cron 遞歸執行 |
25
winterbells 2019-12-24 17:51:37 +08:00 via Android
每次自动添加一个 65 分钟后的时间的任务?
|
26
luban 2019-12-24 17:52:07 +08:00
执行间隔变短,额外的存储控制执行时间
|
27
kilen3a 2019-12-24 17:58:18 +08:00
crontab 建一个只执行一次的脚本,然后等脚本执行完之后计算 65 分钟后的时间,并修改成对应时间,done !
|
28
eason1874 2019-12-24 18:01:30 +08:00
我实现过类似的需求,写一个 sh 文件,在 crontab 每分钟运行。
然后 sh 文件的代码就是:一个开始时间戳常量,运行的时候,先计算这个时间戳距离当前的分钟数,然后拿这个分钟数去除以 65,如果能被整除说明隔了 65 分钟,那就运行,不能整除就结束,等下一分钟。 |
29
dosmlp 2019-12-24 18:02:44 +08:00
直接的没有,楼里看很多人提出了许多间接的方法应该可以
|
30
KENNHI 2019-12-24 18:03:51 +08:00 via Android 10
?就没有一个人能想起 systemd 吗
https://wiki.archlinux.org/index.php/Systemd/Timers_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) 我现在连网络都是用 systemd 配置的,systemd 可不只是 init |
32
mahogany 2019-12-24 18:15:08 +08:00 1
cron */n 指的是分钟数...能被 n 整除时执行,不是每 n 次执行。
为什么非要是 65 分钟,感觉代码不应该依赖这么奇怪的时间 interval。 |
33
DGideas 2019-12-24 18:25:38 +08:00 via Android
写个 shell 循环,然后每次循环先睡 65 分钟,如何?
|
34
superrichman 2019-12-24 18:28:59 +08:00 via iPhone
crontab 不好做,建议用 python 的 apscheduler 可以随便定义 interval
|
35
lululau 2019-12-24 18:30:30 +08:00
30 楼正解,用 systemd/times 替代 cron
|
36
kn007 2019-12-24 18:37:35 +08:00
systemd.timer
|
38
zealot0630 2019-12-24 19:52:14 +08:00 via Android
9102 年了,用 systemd-timer 了,crond 过时了
|
39
hq136234303 2019-12-24 22:46:29 +08:00
保持一个 date,每五分钟执行,然后当 65 分钟就执行代码清除,循环即可。
|
40
hq136234303 2019-12-24 22:46:45 +08:00
保持一个 date,每五分钟执行,然后当 65 分钟就执行代码。清除时间,循环即可。
|
41
SenLief 2019-12-24 22:53:14 +08:00
systemd.timer 搞定,很简单的。65min
|
42
holinhot 2019-12-24 23:34:23 +08:00
自己写个定时器
|
43
fx 2019-12-24 23:46:30 +08:00
自己写个定时器 + 1
|
44
sx90 2019-12-25 00:13:35 +08:00 via Android
哦,就延时 65 分钟,非每隔 65 分钟循环执行
crontab 也可以,让脚本自定义 启动脚本 #!/bin/sh time1 = $(date -d "65 minute" +"%-M %-H") crontab -l > confback crontab -l > conf && echo " ${time1} * * * XXXXXXXX.sh >> /tmp/tmp.txt" >> conf && crontab conf && rm -f conf 执行脚本 #!/bin/sh 你自己的代码 crontab confback && rm -f confback 推荐 30 楼大佬的方法,本人萌新,能闷一个是一个,错了别打脸 |
45
cht 2019-12-25 01:53:28 +08:00
个人用 shell + at,最初是应对一些签到网站需要 24 小时 01 分钟或 25 小时后才能重签的问题写的 🤣
|
46
dangyuluo 2019-12-25 01:57:36 +08:00
用一些 python 定时库来做,cron 在这种情况下有点不足
|
47
loading 2019-12-25 02:44:13 +08:00 via Android 1
crontab 底层实现不也是每次判断一下?
写个 5 分钟的 shell 就行了,分钟数 65 求个余数。 |
48
ashong 2019-12-25 02:53:04 +08:00 via iPhone 1
定义多个 task
0 0 0 0 5 1 0 10 2 ... 13 小时一个周期 |
49
ashong 2019-12-25 03:03:39 +08:00 via iPhone
另一种就是 13 分钟执行一次,脚本检查计数,5 次执行一次真正的代码计数归零
|
50
trafficMGR 2019-12-25 08:28:47 +08:00 via Android
*/65 * * * *
没有了 |
51
guanhui07 2019-12-25 08:29:02 +08:00
timer
|
52
2379920898 2019-12-25 08:58:15 +08:00
这就比较 LOW 了
|
53
xypty 2019-12-25 09:02:24 +08:00
@trafficMGR 最大 59 的
|
54
geying 2019-12-25 09:10:48 +08:00
好奇什么场景
|
55
SjwNo1 2019-12-25 09:13:06 +08:00
@trafficMGR interval 最大 60 建议换 timer
|
56
palmers 2019-12-25 09:16:09 +08:00
可不可以 13 分钟执行一次, 然后计数到 5
|
57
dog82 2019-12-25 09:20:44 +08:00
定义 5 分钟一次的 crontab,mod 65 = 0 时执行即可
|
58
raysonlu 2019-12-25 09:58:30 +08:00
我很好奇大家都没有每秒执行的场景吗?用 sleep 不就完事了么,一样的逻辑啊。
0 * * * * sleep 300; 要执行的命令 意思是每小时执行一次,执行前先睡个 300 秒 |
59
wmwmajie 2019-12-25 09:58:59 +08:00
你设置为 60 分钟一次,然后程序里面休眠 5 分钟不就行了。
|
61
zyq2280539 2019-12-25 10:17:59 +08:00
这个简单啊,写个 shell 放到 crontab 里每天执行一次,然后 shell 里写上代码循环多少次,执行完毕就 sleep 65 分钟,差不多能基本满足需求吧
|
62
cuixiao603 2019-12-25 10:23:03 +08:00
* * * * * sleep 3900;command
|
63
oeagut 2019-12-25 10:28:51 +08:00 via iPhone
date 获取 1970 那个日期到现在的秒数,然后对 65*60 这个数取余,如果余数为 0,执行你的东西
然后把上面的写到 crond 里,每分钟执行一下,逻辑没错吧。 |
64
cnbattle 2019-12-25 10:29:58 +08:00
最后结论 代码层处理..
|
66
zhoudaiyu 2019-12-25 11:30:53 +08:00
sleep 大法好
|
67
Felldeadbird 2019-12-25 11:52:46 +08:00
cron 每分钟执行,然后业务逻辑进行时间判断。 睡眠固然是好,但要是中途因为突发内存占用问题,进程被清空了,不就凉凉
|
68
ShundL 2019-12-25 12:07:12 +08:00
@cuixiao603 #62 你这个不是成了每分钟执行了?
|
69
tinybaby365 2019-12-25 12:32:45 +08:00 via iPhone
at 命令了解一下
|
70
cuixiao603 2019-12-25 14:03:47 +08:00
@ShundL #68 不会啊 3900 秒是 65 分钟啊
|
71
ShundL 2019-12-25 15:41:42 +08:00
@cuixiao603 #70 但 cron 每分钟执行,也就每分钟都创建一个 sleep 65 分钟的任务,每次任务的最终执行时间应该只相差 1 秒吧?
|
72
ryanlid 2019-12-25 15:55:17 +08:00
@cuixiao603 #70 细品一下,从第 65 分钟开始,就变成每分钟执行了
|
73
dier 2019-12-25 16:02:50 +08:00
at 命令了解一下
|
74
InternetExplorer 2019-12-25 16:08:16 +08:00 via Android
systemd.timer 了解一下,现在的系统应该都是 systemd 的了
|
75
james122333 2019-12-25 16:25:20 +08:00
shell 强多了
被低估的工具 主要还是太多人写太差了 |
76
james122333 2019-12-25 16:26:23 +08:00
crontab 的功能完全可以用 shell 实现
|
77
wmwmajie 2019-12-25 16:34:01 +08:00
@shengchao 你的描述是 65 分钟执行一次。
那么我在 crontab 里面加入一个 60 分钟执行一次的任务,然后在任务的代码里面先休眠 5 分钟。 这难道不是 65 分钟执行一次? 如果你是要从 crontab 任务写入的时候开始算 65 分钟执行,那么你就在 0 分的时候修改 crontab,这样每次执行都是 65 分钟后。 |
78
aliao0019 2019-12-25 16:34:22 +08:00
写一个每 13 个小时跑一次的 cron task,在这个脚本里每隔 65 分钟跑一次,一共跑 12 次
|
81
omph 2019-12-25 16:48:29 +08:00
最好用 systemd,否则用 1 楼思路
[自更新 shell 脚本]( https://my.oschina.net/u/1044667/blog/1622308) |
82
krixaar 2019-12-25 16:53:58 +08:00
@wmwmajie 第一次运行是第 60 分钟的时候,延迟 5 分钟,第 65 分钟执行,第二次运行是第 120 分钟的时候,延迟 5 分钟,第 125 分钟执行,125-65=60,间隔是 60 分钟而不是 65 分钟。
|
83
cattyhouse 2019-12-25 21:21:07 +08:00
0 0 * * * command # 0 点 0 分执行第一次
5 1,12,23 * * * command # 1,12.23 点 5 分执行第二次 10 2,13 * * * command # 2,13 点 10 分执行第三次 15 3,14 * * * 20 4,15 * * * 25 5,16 * * * 30 6,17 * * * 35 7,18 * * * 40 8,19 * * * 45 9,20 * * * 50 10,21 * * * 55 11,22 * * * |
84
cattyhouse 2019-12-25 21:35:47 +08:00
更正
0 0,12 * * * /path/to/command 5 1,13 * * * 10 2,14 * * * 15 3,15 * * * 20 4,16 * * * 25 5,17 * * * 30 6,18 * * * 35 7,19 * * * 40 8,20 * * * 45 9,21 * * * 50 10,22 * * * 55 11,23 * * * |
85
cattyhouse 2019-12-25 21:42:00 +08:00
或者最简单就是 while true 大法 代码如下:
#!/bin/bash while true ; do your code here # 呼叫 sleep 65m = 3900 秒 sleep 3900 done |
86
freakxx 2019-12-25 22:11:16 +08:00
|
87
tankren 2019-12-25 22:32:31 +08:00
https://crontab.guru/
|