crontab 能否实现每 50 秒执行一次定时任务

2019-03-13 00:54:55 +08:00
 horek
我有一个需要定时 50 秒执行一次任务的需求,想了半天,只能实现每 10 秒执行一次、30 秒执行一次,就是不知道 50 秒执行一次能不能设置,求指教
10045 次点击
所在节点    Linux
41 条回复
jasonyang9
2019-03-13 12:57:29 +08:00
用 SystemD Timers
Trim21
2019-03-13 12:58:04 +08:00
@zhangxiaodao 因为*/50 会在每个小时的 0 和 50 分钟执行,而不是每 50 分钟执行一次…
Cooky
2019-03-13 13:08:23 +08:00
50 秒 和 60 秒 最小公倍数 300 秒
你定个 5 分钟一次的周期
一次执行的时候 跑一次 sleep 一下 6 回就够了
wwqgtxx
2019-03-13 13:11:52 +08:00
用 systemd timers,能精确到 us 级别,随便你想要多少秒
aimiyooo
2019-03-13 13:14:24 +08:00
crontab 不支持,可以用 supervisor+死循环脚本实现
MrUser
2019-03-13 13:43:19 +08:00
第一步:每 30 秒调用一次中间脚本 do.sh (小于你的 50 秒就可以):
```
* * * * * /home/user/bin/do.sh >>/var/log/crontab-do.sh.log 2>&1
* * * * * sleep 30; /home/user/bin/do.sh >>/var/log/crontab-do.sh.log 2>&1
```

第二步:在中间脚本 do.sh 里判断是不是够 50 秒了(当前时间戳能被 50 整除说明 50 秒到了):
```
#!/bin/bash
dateTime=`date "+%Y-%m-%d %H:%M:%S"`
timeStamp=`date -d "$dateTime" +%s`
remainder=$(($timeStamp % 50))
if [ $remainder = 0 ]; then
echo "50 秒了,该执行你的脚本了,在这里调用你的脚本"
fi
```
MrUser
2019-03-13 13:45:42 +08:00
有 BUG,收回上边的回复。。。。( BUG:需要 60 条 crontab 才行。。。。)
inf0sys
2019-03-13 16:31:27 +08:00
crontab 小时位 /72 试试; )
taolu
2019-03-13 16:41:48 +08:00
time_step=50
for (( i=0; i<300; i=(i+${time_step}) )); do
shell
sleep ${time_step}
done

*/5 * * * * shell
Raymon111111
2019-03-13 17:19:05 +08:00
10 秒来一次, 用计数器控制是个简单又可行的方案.
yc8332
2019-03-13 17:22:06 +08:00
cron 不是分钟级的吗?秒级的应该要自己实现吧
deepdark
2019-03-13 17:39:49 +08:00
@xfspace 老哥你这 50 秒之后,一秒执行一次啊,你只是第一次执行推迟了 50 秒而已
zeroz
2019-03-13 17:49:19 +08:00
PHP 是世界上最好的语言!
Swoole Timer 毫秒精度的定时器 https://wiki.swoole.com/wiki/page/p-timer.html
houm
2019-03-13 18:04:39 +08:00
设 6 条 Cron,试试可行不 @horek
50 0/6 * * * ?
40 1/6 * * * ?
30 2/6 * * * ?
20 3/6 * * * ?
10 4/6 * * * ?
0 5/6 * * * ?
hahaayaoyaoyao
2019-03-13 20:57:13 +08:00
@reus 同意
cpdyj0
2019-03-13 21:01:19 +08:00
要不就别用 crontab 了,写个脚本死循环 timeout 50,拿 systemd 监控,定时重启(防止内存泄漏,不知 bash 这方面是怎么做的)
gscoder
2019-03-13 21:05:41 +08:00
做不到,只能用计数器控制。但那样定时器和逻辑就耦合起来了,不太好。
cpdyj0
2019-03-13 21:07:11 +08:00
哦,bash 好像是类似引用计数那种东西(好像连计数也不存在的 [garbage-collection-in-bash]( https://stackoverflow.com/questions/14806296/garbage-collection-in-bash)
所以倒是不必担心内存问题了,就是监控下别挂了
cpdyj0
2019-03-13 21:07:43 +08:00
@gscoder 写俩脚本 /手动斜眼
sujin190
2019-03-14 15:34:07 +08:00
https://github.com/snower/forsun

推荐下之前写的工具,支持秒级定时,命令行和 crontab 类似

安装
pip install forsun

启动
forsund

设置定时
forsun "set show_date_to_home */50/0 * * * * * sh 'date >> /tmp/date.log'"

查看定时列表
forsun "ls *"

删除定时
forsun "rm show_date_to_home"

时间设置还是多了第三个数字代表的是执行次数,0 代表一直执行,从设置这一刻往后 50 秒运行

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

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

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

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

© 2021 V2EX