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

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

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

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

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

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

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

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

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

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

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

    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   58 天前
    或者最简单就是 while true 大法 代码如下:

    #!/bin/bash

    while true ; do
    your code here
    # 呼叫 sleep 65m = 3900 秒
    sleep 3900
    done
    freakxx
        86
    freakxx   58 天前
    @shengchao #8

    未免过于武断.


    ===========

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

    65 = 13 * 5

    做个 5 分钟的任务,

    当 N % 13 = 0 执行
    tankren
        87
    tankren   58 天前
    https://crontab.guru/
    Dogtler
        88
    Dogtler   57 天前 via iPhone
    @feigle 可以可以
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2144 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:24 · PVG 09:24 · LAX 17:24 · JFK 20:24
    ♥ Do have faith in what you're doing.