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

crontab 能否实现每 50 秒执行一次定时任务

  •  
  •   horek · Mar 13, 2019 · 11042 views
    This topic created in 2620 days ago, the information mentioned may be changed or developed.
    我有一个需要定时 50 秒执行一次任务的需求,想了半天,只能实现每 10 秒执行一次、30 秒执行一次,就是不知道 50 秒执行一次能不能设置,求指教
    41 replies    2019-03-21 10:01:08 +08:00
    ysc3839
        1
    ysc3839  
       Mar 13, 2019 via Android
    大概不行。可以设置成 10 秒执行一次,然后记录一下执行次数,到 5 了才实际执行代码。
    xfspace
        2
    xfspace  
       Mar 13, 2019 via Android   ❤️ 1
    #!/usr/bin/env bash
    sleep 50
    balabala

    crontab -e
    * * * * * /something/bashfile
    sarie
        3
    sarie  
       Mar 13, 2019
    @xfspace 厉害了
    zhangxiaodao
        4
    zhangxiaodao  
       Mar 13, 2019
    你都会设置 30 秒了,50 秒为啥不能设置?
    MajorAdam
        5
    MajorAdam  
       Mar 13, 2019
    之前试过用 cron 表达式应该是不行的
    hanbaobao2005
        6
    hanbaobao2005  
       Mar 13, 2019
    试一下
    */50 * * * * *
    是不是可行
    hayi
        7
    hayi  
       Mar 13, 2019
    @hanbaobao2005 这肯定不行,60 秒一个周期,30 秒内的都可以这样。大于的就不行
    Patrick95
        8
    Patrick95  
       Mar 13, 2019
    * * * * * /bin/bash -l -c "/path/to/executable; sleep 50 ; /path/to/executable"
    horek
        9
    horek  
    OP
       Mar 13, 2019
    @hayi 我也觉得大于 30 秒的都不行
    glasslion
        10
    glasslion  
       Mar 13, 2019   ❤️ 2
    @hayi
    @horek

    cron 表达式 */n 的含义是,当秒数 /分钟数...能被 n 整除时执行, 而不是每 n 分钟执行.
    zhfish
        11
    zhfish  
       Mar 13, 2019
    https://crontab.guru
    最少是 1 分钟
    hugee
        12
    hugee  
       Mar 13, 2019
    @xfspace
    @Patrick95 你两这个不仍然 1 分钟一次?


    @hanbaobao2005 你这个不是 50 分钟才一次?

    lz 说的是每 50 秒一次吧?@horek
    radc
        13
    radc  
       Mar 13, 2019   ❤️ 3
    其实搭配 sleep 是可以实现任意秒数间隔的 就是蛋疼了一点
    比如想要 10s 间隔,那就取个分钟整数,做 sleep 10/20/30/40/50/60 6 个 cronjob (*/1 * * * *)
    要 30s 间隔,就 sleep 30/60,两个 cronjob, (*/1 * * * *)

    比如楼主想要 50s,那就取整到 300s,弄这么几个....... 每 300 秒装填 6 个任务,分别以 50 秒间隔来执行。
    ```
    */5 * * * * (sleep 50; echo `date` >> /tmp/50s.log)
    */5 * * * * (sleep 100; echo `date` >> /tmp/50s.log)
    */5 * * * * (sleep 150; echo `date` >> /tmp/50s.log)
    */5 * * * * (sleep 200; echo `date` >> /tmp/50s.log)
    */5 * * * * (sleep 250; echo `date` >> /tmp/50s.log)
    */5 * * * * (sleep 300; echo `date` >> /tmp/50s.log)
    ```
    测试输出是这样,符合预期 挺 2b 的方法.... but it works! 😂
    ```
    Wed Mar 13 12:15:51 CST 2019
    Wed Mar 13 12:16:41 CST 2019
    Wed Mar 13 12:17:31 CST 2019
    Wed Mar 13 12:18:21 CST 2019
    Wed Mar 13 12:19:11 CST 2019
    Wed Mar 13 12:20:01 CST 2019
    Wed Mar 13 12:20:52 CST 2019
    Wed Mar 13 12:21:42 CST 2019
    Wed Mar 13 12:22:32 CST 2019
    ```
    seeusoon
        14
    seeusoon  
       Mar 13, 2019
    这种需求可以直接考虑 supervise+py 来弄,逻辑简单清晰易于维护更新
    具体逻辑用 py 实现,supervise 负责保证 py 进程不退出
    fuergaosi
        15
    fuergaosi  
       Mar 13, 2019 via iPhone
    @seeusoon supervise 现在应该还是不支持 py3 吧
    xuboying
        16
    xuboying  
       Mar 13, 2019
    这是不是一个 A->B 问题?
    sfqtsh
        17
    sfqtsh  
       Mar 13, 2019 via Android
    用 at 命令
    LoliconInside
        18
    LoliconInside  
       Mar 13, 2019 via Android
    While True:
    time.sleep 50
    reus
        19
    reus  
       Mar 13, 2019
    有 systemd 的 timer 不用,非要用过时的 crond ?
    7654
        20
    7654  
       Mar 13, 2019
    while [ 1 ]
    do
    sleep 50
    done &
    jasonyang9
        21
    jasonyang9  
       Mar 13, 2019
    用 SystemD Timers
    Trim21
        22
    Trim21  
       Mar 13, 2019 via Android
    @zhangxiaodao 因为*/50 会在每个小时的 0 和 50 分钟执行,而不是每 50 分钟执行一次…
    Cooky
        23
    Cooky  
       Mar 13, 2019 via Android
    50 秒 和 60 秒 最小公倍数 300 秒
    你定个 5 分钟一次的周期
    一次执行的时候 跑一次 sleep 一下 6 回就够了
    wwqgtxx
        24
    wwqgtxx  
       Mar 13, 2019
    用 systemd timers,能精确到 us 级别,随便你想要多少秒
    aimiyooo
        25
    aimiyooo  
       Mar 13, 2019
    crontab 不支持,可以用 supervisor+死循环脚本实现
    MrUser
        26
    MrUser  
       Mar 13, 2019
    第一步:每 30 秒调用一次中间脚本 do.sh (小于你的 50 秒就可以):
    ```
    * * * * * /home/user/bin/do.sh >>/var/log/crontab-do.sh.log 2>&1
    * * * * * sleep 30; /home/user/bin/do.sh >>/var/log/crontab-do.sh.log 2>&1
    ```

    第二步:在中间脚本 do.sh 里判断是不是够 50 秒了(当前时间戳能被 50 整除说明 50 秒到了):
    ```
    #!/bin/bash
    dateTime=`date "+%Y-%m-%d %H:%M:%S"`
    timeStamp=`date -d "$dateTime" +%s`
    remainder=$(($timeStamp % 50))
    if [ $remainder = 0 ]; then
    echo "50 秒了,该执行你的脚本了,在这里调用你的脚本"
    fi
    ```
    MrUser
        27
    MrUser  
       Mar 13, 2019
    有 BUG,收回上边的回复。。。。( BUG:需要 60 条 crontab 才行。。。。)
    inf0sys
        28
    inf0sys  
       Mar 13, 2019
    crontab 小时位 /72 试试; )
    taolu
        29
    taolu  
       Mar 13, 2019
    time_step=50
    for (( i=0; i<300; i=(i+${time_step}) )); do
    shell
    sleep ${time_step}
    done

    */5 * * * * shell
    Raymon111111
        30
    Raymon111111  
       Mar 13, 2019
    10 秒来一次, 用计数器控制是个简单又可行的方案.
    yc8332
        31
    yc8332  
       Mar 13, 2019
    cron 不是分钟级的吗?秒级的应该要自己实现吧
    deepdark
        32
    deepdark  
       Mar 13, 2019 via Android
    @xfspace 老哥你这 50 秒之后,一秒执行一次啊,你只是第一次执行推迟了 50 秒而已
    zeroz
        33
    zeroz  
       Mar 13, 2019
    PHP 是世界上最好的语言!
    Swoole Timer 毫秒精度的定时器 https://wiki.swoole.com/wiki/page/p-timer.html
    houm
        34
    houm  
       Mar 13, 2019
    设 6 条 Cron,试试可行不 @horek
    50 0/6 * * * ?
    40 1/6 * * * ?
    30 2/6 * * * ?
    20 3/6 * * * ?
    10 4/6 * * * ?
    0 5/6 * * * ?
    hahaayaoyaoyao
        35
    hahaayaoyaoyao  
       Mar 13, 2019 via Android
    @reus 同意
    cpdyj0
        36
    cpdyj0  
       Mar 13, 2019
    要不就别用 crontab 了,写个脚本死循环 timeout 50,拿 systemd 监控,定时重启(防止内存泄漏,不知 bash 这方面是怎么做的)
    gscoder
        37
    gscoder  
       Mar 13, 2019
    做不到,只能用计数器控制。但那样定时器和逻辑就耦合起来了,不太好。
    cpdyj0
        38
    cpdyj0  
       Mar 13, 2019
    哦,bash 好像是类似引用计数那种东西(好像连计数也不存在的 [garbage-collection-in-bash]( https://stackoverflow.com/questions/14806296/garbage-collection-in-bash)
    所以倒是不必担心内存问题了,就是监控下别挂了
    cpdyj0
        39
    cpdyj0  
       Mar 13, 2019
    @gscoder 写俩脚本 /手动斜眼
    sujin190
        40
    sujin190  
       Mar 14, 2019
    https://github.com/snower/forsun

    推荐下之前写的工具,支持秒级定时,命令行和 crontab 类似

    安装
    pip install forsun

    启动
    forsund

    设置定时
    forsun "set show_date_to_home */50/0 * * * * * sh 'date >> /tmp/date.log'"

    查看定时列表
    forsun "ls *"

    删除定时
    forsun "rm show_date_to_home"

    时间设置还是多了第三个数字代表的是执行次数,0 代表一直执行,从设置这一刻往后 50 秒运行
    NB40B938mff85mtq
        41
    NB40B938mff85mtq  
       Mar 21, 2019
    sleep 正解
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2958 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 126ms · UTC 13:18 · PVG 21:18 · LAX 06:18 · JFK 09:18
    ♥ Do have faith in what you're doing.