Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
shengchao
V2EX  ›  Linux

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

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

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

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

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

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

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

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

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

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

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

    #!/bin/bash

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

    未免过于武断.


    ===========

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

    65 = 13 * 5

    做个 5 分钟的任务,

    当 N % 13 = 0 执行
    tankren
    tankren
    Dec 25, 2019
    87
    https://crontab.guru/
    Dogtler
    Dogtler
    Dec 26, 2019 via iPhone
    88
    @feigle 可以可以
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1810 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 255ms · UTC 09:30 · PVG 17:30 · LAX 01:30 · JFK 04:30
    ♥ Do have faith in what you're doing.