crontab 定时任务 65 分钟执行一次,怎么写? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
shengchao
V2EX    Linux

crontab 定时任务 65 分钟执行一次,怎么写?

  •  
  •   shengchao 2019-12-24 16:40:26 +08:00 3367 次点击
    这是一个创建于 2126 天前的主题,其中的信息可能已经有所发展或是发生改变。
    88 条回复    2019-12-26 12:20:00 +08:00
    MrUser
        1
    MrUser  
       2019-12-24 16:42:17 +08:00
    每 5 分种执行一次 A 脚本,在 A 脚本里判断是不是第 65N 次。
    lihongjie0209
        2
    lihongjie0209  
       2019-12-24 16:43:05 +08:00
    每分钟执行一次, 判断和上次执行时间是否超过 65min(每次执行需要写入执行时间)
    victor
        3
    victor  
       2019-12-24 16:44:34 +08:00
    */5 */1 * * *
    geekvcn
        4
    geekvcn  
       2019-12-24 16:45:35 +08:00
    用 shell 比较方便,crontab 每小时会重置计时
    shengchao
        5
    shengchao  
    OP
       2019-12-24 16:45:47 +08:00
    @victor 你这个是 5 分钟的
    yoshiyuki
        6
    yoshiyuki  
       2019-12-24 16:47:05 +08:00
    没有特别好的写法,cron 本身不支持每 65 分钟这种语法
    真要特别精准的话,需要一个个时间点写下来,00:00、01:05、etc 这样
    feigle
        7
    feigle  
       2019-12-24 16:54:00 +08:00   1
    还有个笨办法,把脚本复制 12 份,每一份每天执行两次,每份之间间隔 65 分钟
    shengchao
        8
    shengchao  
    OP
       2019-12-24 16:55:54 +08:00
    好吧 得到结论,crontab 真的挫
    FS1P7dJz
        9
    FS1P7dJz  
       2019-12-24 16:56:09 +08:00   3
    技术上的实现如果扭曲
    最好先反思一下业务上逻辑是不是存在问题...

    65 分钟这种奇怪的要求,往往不应该让系统去做,应该是开发那边做
    sqdxxx
        10
    sqdxxx  
       2019-12-24 17:00:10 +08:00
    sleep(65*60)
    shengchao
        11
    shengchao  
    OP
       2019-12-24 17:00:16 +08:00
    @FS1P7dJz 非工作业务使用
    zbl430
        12
    zbl430  
       2019-12-24 17:20:14 +08:00
    http://qqe2.com/cron 这个可以测试,但是无法应该实现
    shengchao
        13
    shengchao  
    OP
       2019-12-24 17:23:59 +08:00   1
    @zbl430 https://crontab.guru/ 这个测试也不错
    maichael
        14
    maichael  
       2019-12-24 17:31:41 +08:00
    弄个每小时执行一次的,然后脚本里面先睡 5 分钟。
    b821025551b
        15
    b821025551b  
       2019-12-24 17:35:45 +08:00
    @zbl430 #12
    @shengchao #13
    这个是 Quartz 之类的 crontab,非 linux 的 crontab。
    b821025551b
        16
    b821025551b  
       2019-12-24 17:36:32 +08:00
    @maichael #14
    那也还是每 60 分钟一次,而不是 65
    Lax
        17
    Lax  
       2019-12-24 17:37:23 +08:00
    @shengchao “crontab 真的挫” 得出这个结论是什么逻辑?
    @maichael 这个仍然是每 60 分钟。。。
    est
        18
    est  
       2019-12-24 17:40:14 +08:00
    @MrUser 如果是一个很大的质数怎么办。23333。
    比如 97 分钟执行一次。。。
    caryqy
        19
    caryqy  
       2019-12-24 17:41:02 +08:00
    5 */1 * * *

    a++
    if a%2 == 1 then
    run ...
    fi
    caryqy
        20
    caryqy  
       2019-12-24 17:43:50 +08:00
    缺点 需要额外的一个文件保存计数值
    caryqy
        21
    caryqy  
       2019-12-24 17:47:36 +08:00
    不对,我的方法错的
    dosmlp
        22
    dosmlp  
       2019-12-24 17:48:25 +08:00
    @maichael 那还是每小时执行一次啊
    JJstyle
        23
    JJstyle  
       2019-12-24 17:49:52 +08:00 via iPhone
    1/65 * * * *,难道不是这个吗?
    momocraft
        24
    momocraft  
       2019-12-24 17:51:32 +08:00
    一本生成 100 次隔 65 分的 crontab
    然後用 cron 行
    300
        25
    300  
       2019-12-24 17:51:37 +08:00 via Android
    每次自动添加一个 65 分钟后的时间的任务?
    luban
        26
    luban  
       2019-12-24 17:52:07 +08:00
    执行间隔变短,额外的存储控制执行时间
    kilen3a
        27
    kilen3a  
       2019-12-24 17:58:18 +08:00
    crontab 建一个只执行一次的脚本,然后等脚本执行完之后计算 65 分钟后的时间,并修改成对应时间,done !
    eason1874
        28
    eason1874  
       2019-12-24 18:01:30 +08:00
    我实现过类似的需求,写一个 sh 文件,在 crontab 每分钟运行。

    然后 sh 文件的代码就是:一个开始时间戳常量,运行的时候,先计算这个时间戳距离当前的分钟数,然后拿这个分钟数去除以 65,如果能被整除说明隔了 65 分钟,那就运行,不能整除就结束,等下一分钟。
    dosmlp
        29
    dosmlp  
       2019-12-24 18:02:44 +08:00
    直接的没有,楼里看很多人提出了许多间接的方法应该可以
    KENNHI
        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
    tolbkni
        31
    tolbkni  
       2019-12-24 18:07:34 +08:00
    @maichael 你这也还是每个小时跑一次,只是延后了 5 分钟
    mahogany
        32
    mahogany  
       2019-12-24 18:15:08 +08:00   1
    cron */n 指的是分钟数...能被 n 整除时执行,不是每 n 次执行。
    为什么非要是 65 分钟,感觉代码不应该依赖这么奇怪的时间 interval。
    DGideas
        33
    DGideas  
       2019-12-24 18:25:38 +08:00 via Android
    写个 shell 循环,然后每次循环先睡 65 分钟,如何?
    superrichman
        34
    superrichman  
       2019-12-24 18:28:59 +08:00 via iPhone
    crontab 不好做,建议用 python 的 apscheduler 可以随便定义 interval
    lululau
        35
    lululau  
       2019-12-24 18:30:30 +08:00
    30 楼正解,用 systemd/times 替代 cron
    kn007
        36
    kn007  
       2019-12-24 18:37:35 +08:00
    systemd.timer
    alexsunxl
        37
    alexsunxl  
       2019-12-24 19:04:42 +08:00
    @KENNHI
    学到了, 本机用这个很不错。
    如果是在服务器用 systemd 好像有点藏太深了
    zealot0630
        38
    zealot0630  
       2019-12-24 19:52:14 +08:00 via Android
    9102 年了,用 systemd-timer 了,crond 过时了
    hq136234303
        39
    hq136234303  
       2019-12-24 22:46:29 +08:00
    保持一个 date,每五分钟执行,然后当 65 分钟就执行代码清除,循环即可。
    hq136234303
        40
    hq136234303  
       2019-12-24 22:46:45 +08:00
    保持一个 date,每五分钟执行,然后当 65 分钟就执行代码。清除时间,循环即可。
    SenLief
        41
    SenLief  
       2019-12-24 22:53:14 +08:00
    systemd.timer 搞定,很简单的。65min
    holinhot
        42
    holinhot  
       2019-12-24 23:34:23 +08:00
    自己写个定时器
    fx
        43
    fx  
       2019-12-24 23:46:30 +08:00
    自己写个定时器 + 1
    sx90
        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 楼大佬的方法,本人萌新,能闷一个是一个,错了别打脸
    cht
        45
    cht  
       2019-12-25 01:53:28 +08:00
    个人用 shell + at,最初是应对一些签到网站需要 24 小时 01 分钟或 25 小时后才能重签的问题写的
    dangyuluo
        46
    dangyuluo  
       2019-12-25 01:57:36 +08:00
    用一些 python 定时库来做,cron 在这种情况下有点不足
    loading
        47
    loading  
       2019-12-25 02:44:13 +08:00 via Android   1
    crontab 底层实现不也是每次判断一下?
    写个 5 分钟的 shell 就行了,分钟数 65 求个余数。
    ashong
        48
    ashong  
       2019-12-25 02:53:04 +08:00 via iPhone   1
    定义多个 task

    0 0 0
    0 5 1
    0 10 2
    ...
    13 小时一个周期
    ashong
        49
    ashong  
       2019-12-25 03:03:39 +08:00 via iPhone
    另一种就是 13 分钟执行一次,脚本检查计数,5 次执行一次真正的代码计数归零
    trafficMGR
        50
    trafficMGR  
       2019-12-25 08:28:47 +08:00 via Android
    */65 * * * *

    没有了
    guanhui07
        51
    guanhui07  
       2019-12-25 08:29:02 +08:00
    timer
    2379920898
        52
    2379920898  
       2019-12-25 08:58:15 +08:00
    这就比较 LOW 了
    xypty
        53
    xypty  
       2019-12-25 09:02:24 +08:00
    @trafficMGR 最大 59 的
    geying
        54
    geying  
       2019-12-25 09:10:48 +08:00
    好奇什么场景
    SjwNo1
        55
    SjwNo1  
       2019-12-25 09:13:06 +08:00
    @trafficMGR interval 最大 60 建议换 timer
    palmers
        56
    palmers  
       2019-12-25 09:16:09 +08:00
    可不可以 13 分钟执行一次, 然后计数到 5
    dog82
        57
    dog82  
       2019-12-25 09:20:44 +08:00
    定义 5 分钟一次的 crontab,mod 65 = 0 时执行即可
    raysonlu
        58
    raysonlu  
       2019-12-25 09:58:30 +08:00
    我很好奇大家都没有每秒执行的场景吗?用 sleep 不就完事了么,一样的逻辑啊。

    0 * * * * sleep 300; 要执行的命令

    意思是每小时执行一次,执行前先睡个 300 秒
    wmwmajie
        59
    wmwmajie  
       2019-12-25 09:58:59 +08:00
    你设置为 60 分钟一次,然后程序里面休眠 5 分钟不就行了。
    shengchao
        60
    shengchao  
    OP
       2019-12-25 10:05:01 +08:00
    @wmwmajie 你细品一下,你这个是 60 分钟执行一次
    zyq2280539
        61
    zyq2280539  
       2019-12-25 10:17:59 +08:00
    这个简单啊,写个 shell 放到 crontab 里每天执行一次,然后 shell 里写上代码循环多少次,执行完毕就 sleep 65 分钟,差不多能基本满足需求吧
    cuixiao603
        62
    cuixiao603  
       2019-12-25 10:23:03 +08:00
    * * * * * sleep 3900;command
    oeagut
        63
    oeagut  
       2019-12-25 10:28:51 +08:00 via iPhone
    date 获取 1970 那个日期到现在的秒数,然后对 65*60 这个数取余,如果余数为 0,执行你的东西

    然后把上面的写到 crond 里,每分钟执行一下,逻辑没错吧。
    cnbattle
        64
    cnbattle  
       2019-12-25 10:29:58 +08:00
    最后结论 代码层处理..
    lyis
        65
    lyis  
       2019-12-25 11:26:30 +08:00
    @est 每分钟执行一次
    zhoudaiyu
        66
    zhoudaiyu  
    PRO
       2019-12-25 11:30:53 +08:00
    sleep 大法好
    Felldeadbird
        67
    Felldeadbird  
       2019-12-25 11:52:46 +08:00
    cron 每分钟执行,然后业务逻辑进行时间判断。 睡眠固然是好,但要是中途因为突发内存占用问题,进程被清空了,不就凉凉
    ShundL
        68
    ShundL  
       2019-12-25 12:07:12 +08:00
    @cuixiao603 #62 你这个不是成了每分钟执行了?
    tinybaby365
        69
    tinybaby365  
       2019-12-25 12:32:45 +08:00 via iPhone
    at 命令了解一下
    cuixiao603
        70
    cuixiao603  
       2019-12-25 14:03:47 +08:00
    @ShundL #68 不会啊 3900 秒是 65 分钟啊
    ShundL
        71
    ShundL  
       2019-12-25 15:41:42 +08:00
    @cuixiao603 #70 但 cron 每分钟执行,也就每分钟都创建一个 sleep 65 分钟的任务,每次任务的最终执行时间应该只相差 1 秒吧?
    ryanlid
        72
    ryanlid  
       2019-12-25 15:55:17 +08:00
    @cuixiao603 #70 细品一下,从第 65 分钟开始,就变成每分钟执行了
    dier
        73
    dier  
       2019-12-25 16:02:50 +08:00
    at 命令了解一下
    InternetExplorer
        74
    InternetExplorer  
       2019-12-25 16:08:16 +08:00 via Android
    systemd.timer 了解一下,现在的系统应该都是 systemd 的了
    james122333
        75
    james122333  
       2019-12-25 16:25:20 +08:00
    shell 强多了
    被低估的工具
    主要还是太多人写太差了
    james122333
        76
    james122333  
       2019-12-25 16:26:23 +08:00
    crontab 的功能完全可以用 shell 实现
    wmwmajie
        77
    wmwmajie  
       2019-12-25 16:34:01 +08:00
    @shengchao 你的描述是 65 分钟执行一次。
    那么我在 crontab 里面加入一个 60 分钟执行一次的任务,然后在任务的代码里面先休眠 5 分钟。
    这难道不是 65 分钟执行一次?
    如果你是要从 crontab 任务写入的时候开始算 65 分钟执行,那么你就在 0 分的时候修改 crontab,这样每次执行都是 65 分钟后。
    aliao0019
        78
    aliao0019  
       2019-12-25 16:34:22 +08:00
    写一个每 13 个小时跑一次的 cron task,在这个脚本里每隔 65 分钟跑一次,一共跑 12 次
    aliao0019
        79
    aliao0019  
       2019-12-25 16:35:25 +08:00
    等等,是不是也不支持 “每 13 个小时”
    @aliao0019
    wmwmajie
        80
    wmwmajie  
       2019-12-25 16:36:59 +08:00
    @shengchao 这是实现你描述的一种方式,如果你要 crontab 支持 65 分钟跑一次,没有。
    omph
        81
    omph  
       2019-12-25 16:48:29 +08:00
    最好用 systemd,否则用 1 楼思路
    [自更新 shell 脚本]( https://my.oschina.net/u/1044667/blog/1622308)
    krixaar
        82
    krixaar  
       2019-12-25 16:53:58 +08:00
    @wmwmajie 第一次运行是第 60 分钟的时候,延迟 5 分钟,第 65 分钟执行,第二次运行是第 120 分钟的时候,延迟 5 分钟,第 125 分钟执行,125-65=60,间隔是 60 分钟而不是 65 分钟。
    cattyhouse
        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 * * *
    cattyhouse
        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 * * *
    cattyhouse
        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
    metamask
        86
    metamask  
       2019-12-25 22:11:16 +08:00
    @shengchao #8

    未免过于武断.


    ===========

    可以考虑做一个计数器放在执行体里

    65 = 13 * 5

    做个 5 分钟的任务,

    当 N % 13 = 0 执行
    tankren
        87
    tankren  
       2019-12-25 22:32:31 +08:00
    https://crontab.guru/
    Dogtler
        88
    Dogtler  
       2019-12-26 12:20:00 +08:00 via iPhone
    @feigle 可以可以
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2626 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 44ms UTC 09:22 PVG 17:22 LAX 02:22 JFK 05:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86