crontab 定时任务 65 分钟执行一次,怎么写? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
shengchao
V2EX    Linux

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

  •  
  •   shengchao Dec 24, 2019 34149 views
    This topic created in 2319 days ago, the information mentioned may be changed or developed.
    88 replies    2019-12-26 12:20:00 +08:00
    MrUser
        1
    MrUser  
       Dec 24, 2019
    每 5 分种执行一次 A 脚本,在 A 脚本里判断是不是第 65N 次。
    lihongjie0209
        2
    lihongjie0209  
       Dec 24, 2019
    每分钟执行一次, 判断和上次执行时间是否超过 65min(每次执行需要写入执行时间)
    victor
        3
    victor  
       Dec 24, 2019
    */5 */1 * * *
    geekvcn
        4
    geekvcn  
       Dec 24, 2019
    用 shell 比较方便,crontab 每小时会重置计时
    shengchao
        5
    shengchao  
    OP
       Dec 24, 2019
    @victor 你这个是 5 分钟的
    yoshiyuki
        6
    yoshiyuki  
       Dec 24, 2019
    没有特别好的写法,cron 本身不支持每 65 分钟这种语法
    真要特别精准的话,需要一个个时间点写下来,00:00、01:05、etc 这样
    feigle
        7
    feigle  
       Dec 24, 2019   1
    还有个笨办法,把脚本复制 12 份,每一份每天执行两次,每份之间间隔 65 分钟
    shengchao
        8
    shengchao  
    OP
       Dec 24, 2019
    好吧 得到结论,crontab 真的挫
    FS1P7dJz
        9
    FS1P7dJz  
       Dec 24, 2019   3
    技术上的实现如果扭曲
    最好先反思一下业务上逻辑是不是存在问题...

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

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

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

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

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

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

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

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

    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  
       Dec 25, 2019
    或者最简单就是 while true 大法 代码如下:

    #!/bin/bash

    while true ; do
    your code here
    # 呼叫 sleep 65m = 3900 秒
    sleep 3900
    done
    metamask
        86
    metamask  
       Dec 25, 2019
    @shengchao #8

    未免过于武断.


    ===========

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

    65 = 13 * 5

    做个 5 分钟的任务,

    当 N % 13 = 0 执行
    tankren
        87
    tankren  
       Dec 25, 2019
    https://crontab.guru/
    Dogtler
        88
    Dogtler  
       Dec 26, 2019 via iPhone
    @feigle 可以可以
    About     Help     Advertise     Blog     API     FAQ     Solana     2763 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 336ms UTC 13:33 PVG 21:33 LAX 06:33 JFK 09:33
    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