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

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

  •  
  •   horek · Mar 13, 2019 · 11752 views
    This topic created in 2796 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
    ysc3839
    Mar 13, 2019 via Android
    1
    大概不行。可以设置成 10 秒执行一次,然后记录一下执行次数,到 5 了才实际执行代码。
    xfspace
    xfspace
    Mar 13, 2019 via Android❤️1
    2
    #!/usr/bin/env bash
    sleep 50
    balabala

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

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


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

    lz 说的是每 50 秒一次吧?@horek
    radc
    radc
    Mar 13, 2019❤️3
    13
    其实搭配 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
    seeusoon
    Mar 13, 2019
    14
    这种需求可以直接考虑 supervise+py 来弄,逻辑简单清晰易于维护更新
    具体逻辑用 py 实现,supervise 负责保证 py 进程不退出
    fuergaosi
    fuergaosi
    Mar 13, 2019 via iPhone
    15
    @seeusoon supervise 现在应该还是不支持 py3 吧
    xuboying
    xuboying
    Mar 13, 2019
    16
    这是不是一个 A->B 问题?
    sfqtsh
    sfqtsh
    Mar 13, 2019 via Android
    17
    用 at 命令
    LoliconInside
    LoliconInside
    Mar 13, 2019 via Android
    18
    While True:
    time.sleep 50
    reus
    reus
    Mar 13, 2019
    19
    有 systemd 的 timer 不用,非要用过时的 crond ?
    7654
    7654
    Mar 13, 2019
    20
    while [ 1 ]
    do
    sleep 50
    done &
    jasonyang9
    jasonyang9
    Mar 13, 2019
    21
    用 SystemD Timers
    Trim21
    Trim21
    Mar 13, 2019 via Android
    22
    @zhangxiaodao 因为*/50 会在每个小时的 0 和 50 分钟执行,而不是每 50 分钟执行一次…
    Cooky
    Cooky
    Mar 13, 2019 via Android
    23
    50 秒 和 60 秒 最小公倍数 300 秒
    你定个 5 分钟一次的周期
    一次执行的时候 跑一次 sleep 一下 6 回就够了
    wwqgtxx
    wwqgtxx
    Mar 13, 2019
    24
    用 systemd timers,能精确到 us 级别,随便你想要多少秒
    aimiyooo
    aimiyooo
    Mar 13, 2019
    25
    crontab 不支持,可以用 supervisor+死循环脚本实现
    MrUser
    MrUser
    Mar 13, 2019
    26
    第一步:每 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
    MrUser
    Mar 13, 2019
    27
    有 BUG,收回上边的回复。。。。( BUG:需要 60 条 crontab 才行。。。。)
    inf0sys
    inf0sys
    Mar 13, 2019
    28
    crontab 小时位 /72 试试; )
    taolu
    taolu
    Mar 13, 2019
    29
    time_step=50
    for (( i=0; i<300; i=(i+${time_step}) )); do
    shell
    sleep ${time_step}
    done

    */5 * * * * shell
    Raymon111111
    Raymon111111
    Mar 13, 2019
    30
    10 秒来一次, 用计数器控制是个简单又可行的方案.
    yc8332
    yc8332
    Mar 13, 2019
    31
    cron 不是分钟级的吗?秒级的应该要自己实现吧
    deepdark
    deepdark
    Mar 13, 2019 via Android
    32
    @xfspace 老哥你这 50 秒之后,一秒执行一次啊,你只是第一次执行推迟了 50 秒而已
    zeroz
    zeroz
    Mar 13, 2019
    33
    PHP 是世界上最好的语言!
    Swoole Timer 毫秒精度的定时器 https://wiki.swoole.com/wiki/page/p-timer.html
    houm
    houm
    Mar 13, 2019
    34
    设 6 条 Cron,试试可行不 @horek
    50 0/6 * * * ?
    40 1/6 * * * ?
    30 2/6 * * * ?
    20 3/6 * * * ?
    10 4/6 * * * ?
    0 5/6 * * * ?
    hahaayaoyaoyao
    hahaayaoyaoyao
    Mar 13, 2019 via Android
    35
    @reus 同意
    cpdyj0
    cpdyj0
    Mar 13, 2019
    36
    要不就别用 crontab 了,写个脚本死循环 timeout 50,拿 systemd 监控,定时重启(防止内存泄漏,不知 bash 这方面是怎么做的)
    gscoder
    gscoder
    Mar 13, 2019
    37
    做不到,只能用计数器控制。但那样定时器和逻辑就耦合起来了,不太好。
    cpdyj0
    cpdyj0
    Mar 13, 2019
    38
    哦,bash 好像是类似引用计数那种东西(好像连计数也不存在的 [garbage-collection-in-bash]( https://stackoverflow.com/questions/14806296/garbage-collection-in-bash)
    所以倒是不必担心内存问题了,就是监控下别挂了
    cpdyj0
    cpdyj0
    Mar 13, 2019
    39
    @gscoder 写俩脚本 /手动斜眼
    sujin190
    sujin190
    Mar 14, 2019
    40
    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
    NB40B938mff85mtq
    Mar 21, 2019
    41
    sleep 正解
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2034 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 190ms · UTC 02:28 · PVG 10:28 · LAX 18:28 · JFK 21:28
    ♥ Do have faith in what you're doing.