V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
shengchao
V2EX  ›  Linux

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

  •  
  •   shengchao · 2019-12-24 16:40:26 +08:00 · 32572 次点击
    这是一个创建于 1576 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 遞歸執行
    winterbells
        25
    winterbells  
       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  
       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
    freakxx
        86
    freakxx  
       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   ·   我们的愿景   ·   实用小工具   ·   5284 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 07:38 · PVG 15:38 · LAX 00:38 · JFK 03:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.