我有一个需要定时 50 秒执行一次任务的需求,想了半天,只能实现每 10 秒执行一次、30 秒执行一次,就是不知道 50 秒执行一次能不能设置,求指教
|
ysc3839Mar 13, 2019 via Android
1
大概不行。可以设置成 10 秒执行一次,然后记录一下执行次数,到 5 了才实际执行代码。
|
|
2
#!/usr/bin/env bash
sleep 50 balabala crontab -e * * * * * /something/bashfile |
|
zhangxiaodaoMar 13, 2019
4
你都会设置 30 秒了,50 秒为啥不能设置?
|
|
MajorAdamMar 13, 2019
5
之前试过用 cron 表达式应该是不行的
|
|
hanbaobao2005Mar 13, 2019
6
试一下
*/50 * * * * * 是不是可行 |
|
hayiMar 13, 2019
7
@hanbaobao2005 这肯定不行,60 秒一个周期,30 秒内的都可以这样。大于的就不行
|
|
Patrick95Mar 13, 2019
8
* * * * * /bin/bash -l -c "/path/to/executable; sleep 50 ; /path/to/executable"
|
|
zhfishMar 13, 2019
11
https://crontab.guru
最少是 1 分钟 |
|
hugeeMar 13, 2019
12
|
|
13
其实搭配 sleep 是可以实现任意秒数间隔的 就是蛋疼了一点
比如想要 10s 间隔,那就取个分钟整数,做 sleep 10/20/30/40/50/60 6 个 cronjob (*/1 * * * *) 要 30s 间隔,就 sleep 30/60,两个 cronjob, (*/1 * * * *) 比如楼主想要 50s,那就取整到 300s,弄这么几个....... 每 300 秒装填 6 个任务,分别以 50 秒间隔来执行。 ``` */5 * * * * (sleep 50; echo `date` >> /tmp/50s.log) */5 * * * * (sleep 100; echo `date` >> /tmp/50s.log) */5 * * * * (sleep 150; echo `date` >> /tmp/50s.log) */5 * * * * (sleep 200; echo `date` >> /tmp/50s.log) */5 * * * * (sleep 250; echo `date` >> /tmp/50s.log) */5 * * * * (sleep 300; echo `date` >> /tmp/50s.log) ``` 测试输出是这样,符合预期 挺 2b 的方法.... but it works! 😂 ``` Wed Mar 13 12:15:51 CST 2019 Wed Mar 13 12:16:41 CST 2019 Wed Mar 13 12:17:31 CST 2019 Wed Mar 13 12:18:21 CST 2019 Wed Mar 13 12:19:11 CST 2019 Wed Mar 13 12:20:01 CST 2019 Wed Mar 13 12:20:52 CST 2019 Wed Mar 13 12:21:42 CST 2019 Wed Mar 13 12:22:32 CST 2019 ``` |
|
seeusoonMar 13, 2019
14
这种需求可以直接考虑 supervise+py 来弄,逻辑简单清晰易于维护更新
具体逻辑用 py 实现,supervise 负责保证 py 进程不退出 |
|
xuboyingMar 13, 2019
16
这是不是一个 A->B 问题?
|
|
sfqtshMar 13, 2019 via Android
17
用 at 命令
|
|
LoliconInsideMar 13, 2019 via Android
18
While True:
time.sleep 50 |
|
reusMar 13, 2019
19
有 systemd 的 timer 不用,非要用过时的 crond ?
|
|
7654Mar 13, 2019
20
while [ 1 ]
do sleep 50 done & |
|
jasonyang9Mar 13, 2019
21
用 SystemD Timers
|
|
Trim21Mar 13, 2019 via Android
22
@zhangxiaodao 因为*/50 会在每个小时的 0 和 50 分钟执行,而不是每 50 分钟执行一次…
|
|
CookyMar 13, 2019 via Android
23
50 秒 和 60 秒 最小公倍数 300 秒
你定个 5 分钟一次的周期 一次执行的时候 跑一次 sleep 一下 6 回就够了 |
|
wwqgtxxMar 13, 2019
24
用 systemd timers,能精确到 us 级别,随便你想要多少秒
|
|
aimiyoooMar 13, 2019
25
crontab 不支持,可以用 supervisor+死循环脚本实现
|
|
MrUserMar 13, 2019
26
第一步:每 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 ``` |
|
MrUserMar 13, 2019
27
有 BUG,收回上边的回复。。。。( BUG:需要 60 条 crontab 才行。。。。)
|
|
inf0sysMar 13, 2019
28
crontab 小时位 /72 试试; )
|
|
taoluMar 13, 2019
29
time_step=50
for (( i=0; i<300; i=(i+${time_step}) )); do shell sleep ${time_step} done */5 * * * * shell |
|
Raymon111111Mar 13, 2019
30
10 秒来一次, 用计数器控制是个简单又可行的方案.
|
|
yc8332Mar 13, 2019
31
cron 不是分钟级的吗?秒级的应该要自己实现吧
|
|
zerozMar 13, 2019
33
PHP 是世界上最好的语言!
Swoole Timer 毫秒精度的定时器 https://wiki.swoole.com/wiki/page/p-timer.html |
|
houmMar 13, 2019
34
设 6 条 Cron,试试可行不 @horek
50 0/6 * * * ? 40 1/6 * * * ? 30 2/6 * * * ? 20 3/6 * * * ? 10 4/6 * * * ? 0 5/6 * * * ? |
|
hahaayaoyaoyaoMar 13, 2019 via Android
35
@reus 同意
|
|
cpdyj0Mar 13, 2019
36
要不就别用 crontab 了,写个脚本死循环 timeout 50,拿 systemd 监控,定时重启(防止内存泄漏,不知 bash 这方面是怎么做的)
|
|
gscoderMar 13, 2019
37
做不到,只能用计数器控制。但那样定时器和逻辑就耦合起来了,不太好。
|
|
cpdyj0Mar 13, 2019
38
哦,bash 好像是类似引用计数那种东西(好像连计数也不存在的 [garbage-collection-in-bash]( https://stackoverflow.com/questions/14806296/garbage-collection-in-bash)
所以倒是不必担心内存问题了,就是监控下别挂了 |
|
sujin190Mar 14, 2019
40
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 秒运行 |
|
NB40B938mff85mtqMar 21, 2019
41
sleep 正解
|