V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wuyadaxian
V2EX  ›  程序员

[疑问]如何使用 cron 让脚本每 7 分钟执行一次?

  •  4
     
  •   wuyadaxian · 188 天前 · 15303 次点击
    这是一个创建于 188 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我的环境是 Ubuntu 22.04LTS 。
    要求是从现在或者某个时间点开始,每 7 分钟执行一次 test.sh 脚本。
    只能使用 crontab 来编写。
    只是讨论,真正实现的时候肯定用 bash 或者其他语言脚本更方便实现。
    第 1 条附言  ·  186 天前
    -------------2024.6.1----------------
    我们现在拥有了两种解法,如果还有其他解法请尽情探讨。
    一种穷举法,见#22 ,#32 ,#33 ,#34 ,#113
    一种复杂的 command 法,见#39 ,#40 ,#45 ,#51 ,#68 ,#96 ,#119
    -----------------------------
    穷举法:(需要增加偏移量的时候,调整周位置上的数字即可)
    #周一
    0-56/7 0-21/7 * * 1 command
    3-59/7 1-22/7 * * 1 command
    6-55/7 2-23/7 * * 1 command
    2-58/7 3-17/7 * * 1 command
    5-54/7 4-18/7 * * 1 command
    1-57/7 5-29/7 * * 1 command
    4-53/7 6-20/7 * * 1 command
    #周二
    2-58/7 0-21/7 * * 2 command
    5-54/7 1-22/7 * * 2 command
    1-57/7 2-23/7 * * 2 command
    4-53/7 3-17/7 * * 2 command
    0-56/7 4-18/7 * * 2 command
    3-59/7 5-29/7 * * 2 command
    6-55/7 6-20/7 * * 2 command
    #周三
    4-53/7 0-21/7 * * 3 command
    0-56/7 1-22/7 * * 3 command
    3-59/7 2-23/7 * * 3 command
    6-55/7 3-17/7 * * 3 command
    2-58/7 4-18/7 * * 3 command
    5-54/7 5-29/7 * * 3 command
    1-57/7 6-20/7 * * 3 command
    #周四
    6-55/7 0-21/7 * * 4 command
    2-58/7 1-22/7 * * 4 command
    5-54/7 2-23/7 * * 4 command
    1-57/7 3-17/7 * * 4 command
    4-53/7 4-18/7 * * 4 command
    0-56/7 5-29/7 * * 4 command
    3-59/7 6-20/7 * * 4 command
    #周五
    1-57/7 0-21/7 * * 5 command
    4-53/7 1-22/7 * * 5 command
    0-56/7 2-23/7 * * 5 command
    3-59/7 3-17/7 * * 5 command
    6-55/7 4-18/7 * * 5 command
    2-58/7 5-29/7 * * 5 command
    5-54/7 6-20/7 * * 5 command
    #周六
    3-59/7 0-21/7 * * 6 command
    6-55/7 1-22/7 * * 6 command
    2-58/7 2-23/7 * * 6 command
    5-54/7 3-17/7 * * 6 command
    1-57/7 4-18/7 * * 6 command
    4-53/7 5-29/7 * * 6 command
    0-56/7 6-20/7 * * 6 command
    #周日
    5-54/7 0-21/7 * * 7 command
    1-57/7 1-22/7 * * 7 command
    4-53/7 2-23/7 * * 7 command
    0-56/7 3-17/7 * * 7 command
    3-59/7 4-18/7 * * 7 command
    6-55/7 5-29/7 * * 7 command
    2-58/7 6-20/7 * * 7 command
    -----------------------------
    复杂 command 法:(需要增加偏移量 N 的时候:((data+%s)/60+N)%7 )
    * * * * * [ $(($(date +\%s) / 60 \% 7 )) -eq 0 ] && ( command )
    第 2 条附言  ·  186 天前
    根据#138 的提示。穷举法可以进一步缩写为:
    #周一
    0/7 0/7 * * 1 command
    3/7 1/7 * * 1 command
    6/7 2/7 * * 1 command
    2/7 3/7 * * 1 command
    5/7 4/7 * * 1 command
    1/7 5/7 * * 1 command
    4/7 6/7 * * 1 command
    #周二
    2/7 0/7 * * 2 command
    5/7 1/7 * * 2 command
    1/7 2/7 * * 2 command
    4/7 3/7 * * 2 command
    0/7 4/7 * * 2 command
    3/7 5/7 * * 2 command
    6/7 6/7 * * 2 command
    #周三
    4/7 0/7 * * 3 command
    0/7 1/7 * * 3 command
    3/7 2/7 * * 3 command
    6/7 3/7 * * 3 command
    2/7 4/7 * * 3 command
    5/7 5/7 * * 3 command
    1/7 6/7 * * 3 command
    #周四
    6/7 0/7 * * 4 command
    2/7 1/7 * * 4 command
    5/7 2/7 * * 4 command
    1/7 3/7 * * 4 command
    4/7 4/7 * * 4 command
    0/7 5/7 * * 4 command
    3/7 6/7 * * 4 command
    #周五
    1/7 0/7 * * 5 command
    4/7 1/7 * * 5 command
    0/7 2/7 * * 5 command
    3/7 3/7 * * 5 command
    6/7 4/7 * * 5 command
    2/7 5/7 * * 5 command
    5/7 6/7 * * 5 command
    #周六
    3/7 0/7 * * 6 command
    6/7 1/7 * * 6 command
    2/7 2/7 * * 6 command
    5/7 3/7 * * 6 command
    1/7 4/7 * * 6 command
    4/7 5/7 * * 6 command
    0/7 6/7 * * 6 command
    #周日
    5/7 0/7 * * 7 command
    1/7 1/7 * * 7 command
    4/7 2/7 * * 7 command
    0/7 3/7 * * 7 command
    3/7 4/7 * * 7 command
    6/7 5/7 * * 7 command
    2/7 6/7 * * 7 command
    162 条回复    2024-06-03 17:29:59 +08:00
    1  2  
    storyxc
        101
    storyxc  
       187 天前
    @superrichman #12 学到了
    hero1874
        102
    hero1874  
       187 天前
    还是得写脚本吧 cron 不行
    p1gd0g
        103
    p1gd0g  
       187 天前
    歪个楼,不能改 sh 那能不能套一层 sh 呢。我看评论里的 cron 未免也太复杂了
    josephok
        104
    josephok  
       187 天前
    X-Y problem
    josephok
        105
    josephok  
       187 天前   ❤️ 1
    V2IEX
        106
    V2IEX  
       187 天前
    cron 每分钟执行一次,代码里记录执行次数 n ,if(n%7)==0 执行代码
    EndlessMemory
        107
    EndlessMemory  
       187 天前
    穷举居然是最可靠的
    channg
        108
    channg  
       187 天前
    没想到真能学到知识
    CHTuring
        109
    CHTuring  
       187 天前
    啊,以前从没想过 cron 的这种知识,都是网页生成一个就用了。
    Goooooos
        110
    Goooooos  
       187 天前
    #!/bin/bash

    function is_execute(){
    echo 1 >> exec_count.log
    lines="$(cat exec_count.log| wc -l)"
    if [ "$lines" -eq "7" ]; then
    cat /dev/null > exec_count.log
    return 0
    else
    return 1
    fi
    }

    is_execute
    rs="$?"


    笨方法,返回 0 就执行,1 就退出脚本。每分钟一次
    dna1982
        111
    dna1982  
       187 天前
    什么年代了
    早就该换 systemd 了
    mingwiki
        112
    mingwiki  
       187 天前
    @dna1982 #111 systemd 太大了,我就喜欢 openrc 这种,只不过定时任务这块我不用 crontab,我倾向于写 python 脚本。
    baoshijiagong
        113
    baoshijiagong  
       187 天前   ❤️ 1
    @josephok Good!

    如果不为解决实际问题,只是讨论 cron 用法,只考虑修改 crontab ,只能穷举, 7 * 7 条,如上面提及的 AI 回复的穷举。还可以优化一下,比如第一位可以改成类似 5-59/7 ,不用写一大堆。

    那么引申一下,如果是 2, 3, 5, 7 以外的质数,比如 11 ,就没办法做到了。


    如果是为解决实际问题,有很多 easy 的办法。

    如 @josephok 所说,尽量少 X-Y 。OP 的第一行写道 “我的环境是 Ubuntu 22.04LTS 。”,那么给人的感觉是抛出一个实际待验证的问题,尽量表达好自己的意思,少误导你想求助的人,到底是真的抽象问题的探讨,还是要解决实际问题,如果是前者,最好是改成类似这样:

    是否可以只在 crontab 里实现,每 7 分钟执行一次命令?
    y1y1
        114
    y1y1  
       187 天前
    加一层或者穷举
    dna1982
        115
    dna1982  
       187 天前
    @mingwiki #112 什么系统不带 systemd 啊。我用的 Debian ( 11 还是 12 忘了)连 SSH 服务都是 systemd 的了。
    Huelse
        116
    Huelse  
       187 天前
    https://tool.lu/crontab/ 验证 `*/7 * * * *`确实不行,到整点就不对了,
    换个思路,每分钟执行,在/tmp 存下时间,如果距离上次执行大于等于 7 分钟了就执行 sh
    wuyadaxian
        117
    wuyadaxian  
    OP
       187 天前
    @baoshijiagong 因为之前查了资料,有系统环境差异。
    比如#51 楼提到的,macOS 下 crontab 和 linux 下 crontab 就可能会不一样。
    而且有些特别的 arm 芯片上的特定版本 os 下的 crontab 也可能有差异。
    我考虑的是尽可能说出相关环境,用于实践测试。
    wuyadaxian
        118
    wuyadaxian  
    OP
       187 天前
    @baoshijiagong
    你可以把它看做一道面试/考试题。
    你进入正在一个面试/考试,电脑画面已经打开了 crontab -e 。
    考题是每 7 分钟执行一次 test.sh
    已经确认 user 对 test.sh 有读写运行权限。
    一旦你关闭这个编辑界面面试/考试即结束。
    -----------------------------------------------------
    以上是我瞎编的。
    我并不是想解决任何实际问题。
    毕竟实际问题上不会存在这么奇葩的要求,一般 */5 * * * * command 就够用了。
    wuyadaxian
        119
    wuyadaxian  
    OP
       187 天前   ❤️ 1
    @noyle #96 it works!!!!
    感谢#96 楼,需要注意#96 楼提到的两点问题。

    我使用下面的代码:
    * * * * * [ $(($(date +\%s) / 60 \% 1 )) -eq 0 ] && ( /etc/test.sh )
    ww2000e
        120
    ww2000e  
       187 天前
    这种问大模型就行。。
    darkengine
        121
    darkengine  
       187 天前
    sh 不能修改。
    ------

    自己写个脚本把这个 sh 包起来,新脚本每分钟跑一次,然后判断是否过了 7 分钟,是就调用这个目标 sh 就好了
    wuyadaxian
        122
    wuyadaxian  
    OP
       187 天前   ❤️ 1
    我们现在拥有了两种解法
    一种穷举法,见#22 ,#32 ,#33 ,#34 ,#113
    一种复杂的 command 法,见#39 ,#40 ,#45 ,#51 ,#68 ,#96 ,#119
    -----------------------------
    穷举法:
    #周一
    0-56/7 0-21/7 * * 1 command
    3-59/7 1-22/7 * * 1 command
    6-55/7 2-23/7 * * 1 command
    2-58/7 3-17/7 * * 1 command
    5-54/7 4-18/7 * * 1 command
    1-57/7 5-29/7 * * 1 command
    4-53/7 6-20/7 * * 1 command
    #周二
    2-58/7 0-21/7 * * 2 command
    5-54/7 1-22/7 * * 2 command
    1-57/7 2-23/7 * * 2 command
    4-53/7 3-17/7 * * 2 command
    0-56/7 4-18/7 * * 2 command
    3-59/7 5-29/7 * * 2 command
    6-55/7 6-20/7 * * 2 command
    #周三
    4-53/7 0-21/7 * * 3 command
    0-56/7 1-22/7 * * 3 command
    3-59/7 2-23/7 * * 3 command
    6-55/7 3-17/7 * * 3 command
    2-58/7 4-18/7 * * 3 command
    5-54/7 5-29/7 * * 3 command
    1-57/7 6-20/7 * * 3 command
    #周四
    6-55/7 0-21/7 * * 4 command
    2-58/7 1-22/7 * * 4 command
    5-54/7 2-23/7 * * 4 command
    1-57/7 3-17/7 * * 4 command
    4-53/7 4-18/7 * * 4 command
    0-56/7 5-29/7 * * 4 command
    3-59/7 6-20/7 * * 4 command
    #周五
    1-57/7 0-21/7 * * 5 command
    4-53/7 1-22/7 * * 5 command
    0-56/7 2-23/7 * * 5 command
    3-59/7 3-17/7 * * 5 command
    6-55/7 4-18/7 * * 5 command
    2-58/7 5-29/7 * * 5 command
    5-54/7 6-20/7 * * 5 command
    #周六
    3-59/7 0-21/7 * * 6 command
    6-55/7 1-22/7 * * 6 command
    2-58/7 2-23/7 * * 6 command
    5-54/7 3-17/7 * * 6 command
    1-57/7 4-18/7 * * 6 command
    4-53/7 5-29/7 * * 6 command
    0-56/7 6-20/7 * * 6 command
    #周日
    5-54/7 0-21/7 * * 7 command
    1-57/7 1-22/7 * * 7 command
    4-53/7 2-23/7 * * 7 command
    0-56/7 3-17/7 * * 7 command
    3-59/7 4-18/7 * * 7 command
    6-55/7 5-29/7 * * 7 command
    2-58/7 6-20/7 * * 7 command
    -----------------------------
    复杂 command 法:
    * * * * * [ $(($(date +\%s) / 60 \% 7 )) -eq 0 ] && ( command )
    awalkingman
        123
    awalkingman  
       187 天前
    @hackerwgf #99 是吧,这个帖子氛围真好
    Felldeadbird
        124
    Felldeadbird  
       187 天前
    啊,涨知识了。cron 原来不被整除就 跑不了啊。我系统好多这样的设置。
    janus77
        125
    janus77  
       187 天前
    你在 sh 外面再包一层 sh 然后里面判断时间就行了吧
    banyasmya23
        126
    banyasmya23  
       187 天前
    @bthulu #15 那用啥
    msg7086
        127
    msg7086  
       187 天前
    cron 只能穷举,systemd-timer 让 AI 生成两个文件往服务器里一塞,一分钟搞定。
    xqzr
        128
    xqzr  
       187 天前
    @Livid #22 Ai
    LXGMAX
        129
    LXGMAX  
       187 天前
    while
    do
    if now - last > 7 * 60:
    run
    done

    /doge
    D33109
        130
    D33109  
       187 天前
    每分钟执行一次 bash 脚本+ sleep 420,或者使用 at 命令

    ```
    now=$(date +%s)
    next_run=$(($now + 420))
    at -f /path/to/your/script.sh $(date -r $next_run +%H:%M)
    ```
    gule10
        131
    gule10  
       187 天前
    0,7,14,21,28,35,42,49,56 0,8,15,22 * * * command
    3,10,17,24,31,38,45,52,59 1,9,16,23 * * * command
    6,13,20,27,34,41,48,55 2,10,17,24 * * * command
    2,9,16,23,30,37,44,51,58 4,11,18 * * * command
    5,12,19,26,33,40,47,54 5,12,19 * * * command
    1,8,15,22,29,36,43,50,57 6,13,20 * * * command
    4,11,18,25,32,39,45,53 7,14,21 * * * command
    nomytwins
        132
    nomytwins  
       187 天前
    */7
    每小时的 0 分、7 分、14 分、21 分、28 分、35 分、42 分、49 分、56 分
    realpg
        133
    realpg  
       187 天前
    cron + at
    已运行超过 6 年 无差错 无漏执行
    wanqingfengtao
        134
    wanqingfengtao  
       187 天前
    歪个楼,OP 考虑这么多,考虑闰秒了吗?🤪
    wuyadaxian
        135
    wuyadaxian  
    OP
       187 天前
    @wanqingfengtao 哈哈哈。没有。
    全部交给 NTP 。
    yankebupt
        136
    yankebupt  
       186 天前
    @wuyadaxian 还真的,小时也可以用除 7 偏移量,只想到分钟可以,脑子瓦特了
    guanzhangzhang
        137
    guanzhangzhang  
       186 天前
    @lolizeppelin #47 +1 ,看了 40 多层,才看到有人提 systemd 的 timer
    yankebupt
        138
    yankebupt  
       186 天前   ❤️ 1
    @wuyadaxian 对了问个问题
    比如周三这条
    3-59/7 2-23/7 * * 3 command
    不加-23 或者-59 会怎样?会超过 60 分钟或 24 小时么?
    sampeng
        139
    sampeng  
       186 天前 via iPhone
    其实如果是我…我会改成 6 分钟或者 5 分钟。然后去怼提出这个需求的人。
    jevonszmx
        140
    jevonszmx  
       186 天前
    我一般是每分钟执行,然后代码里面控制真正的逻辑
    honjow
        141
    honjow  
       186 天前
    @Felldeadbird #124 能跑啊。。。只是不能整除的话,最后一次间隔就不对啊
    w568w
        142
    w568w  
       186 天前   ❤️ 1
    @mingwiki 必须纠正一个误区:systemd 可能确实看起来功能很多,但毕竟是用 C 写的,实际上是非常轻量的:本身完全体只占用不到 10MB 内存、CPU 占用接近 0 。OpenRC 之类靠 Shell 程序的解决方案,怎么做都不如 C 性能高、占用小、功耗低。如果只看占用和功能,实际上服务和需求多起来,OpenRC 占不到多少便宜,对服务的控制力度还小得多。

    大部分人还是由于对 systemd 的学习曲线望而却步或者不认同 systemd 的设计,所以认为 systemd 臃肿。但就楼主这个需求,systemd timer 应该是最简单、轻量的解决方案。
    BraveXaiver
        143
    BraveXaiver  
       186 天前
    题主现在有结论了不?可以 append 一下吗?
    lolizeppelin
        144
    lolizeppelin  
       186 天前 via iPhone
    在 cron 里绕来绕去
    用 6 整除。脚本里根据启动时间 sleep 到 7 分钟
    周期一 sleep 60
    周期二 sleep 120
    第六周期直接跳过
    james122333
        145
    james122333  
       186 天前 via Android
    @w568w

    早就破 30MB 了好吗 压缩的不是真实大小
    openrc... 2MB 以内 算上额外脚本包也多不了多少 systemd 要做那么多事早就注定它小不了
    运行的东西多怎能期待它能占用小 很多东西都不是很必要 它提供的特性说实话我都用不到 很多东西我都可以直接写脚本解决 运行效率也不低 只要你会写 这种东西就不是给你组装使用的 灵活与扩充性降低 unix 哲学好在我能够用原生工具凑出我要的东西 而不用上游没出下游不用想 也不用整天在找工具 而且你太小看脚本了
    james122333
        146
    james122333  
       186 天前 via Android
    @w568w

    再给你个看法 一个东西能性能高占用小 语言只是其中一个因素 很多时后更重要的还是在于你怎么写
    james122333
        147
    james122333  
       186 天前 via Android
    @w568w

    C 语言上限高不代表用 C 写的都是好货
    w568w
        148
    w568w  
       186 天前
    @james122333 #147

    > 早就破 30MB 了好吗 压缩的不是真实大小……openrc... 2MB 以内 算上额外脚本包也多不了多少

    我认为你和我说的根本不是一件事:我说的是 RAM 占用,你说的是安装后的文件体积。

    ---

    > systemd 要做那么多事早就注定它小不了 运行的东西多怎能期待它能占用小
    > C 语言上限高不代表用 C 写的都是好货

    「注定它小不了」的数字和证据,来源请求?请勿脑测程序性能。我用你后一句的原话返还:要做的事情多不代表占用大、组合性好不代表占用小。

    ---

    > unix 哲学好在我能够用原生工具凑出我要的东西 而不用上游没出下游不用想

    是的,Systemd 和 Unix 哲学有冲突,但正如我说的,很多人不喜欢 Systemd 就是因为它的设计。KISS 和 All in one 本来就是有分歧的。但在服务调度和管理这件事上,我站 systemd 这边。

    我没有一棒子打死 Shell ,只是认为应该给 systemd 正名。毕竟「污名化」「虚无化」 systemd 的声音太多,会给 Linux 萌新错误的第一印象。

    ---

    > 你太小看脚本了

    我哪里说脚本不好了?我的原话是:「就楼主这个需求,systemd timer 应该是最简单、轻量的解决方案」。你说的和我的回复有关系?

    ---

    > 再给你个看法 一个东西能性能高占用小 语言只是其中一个因素 很多时后更重要的还是在于你怎么写

    你也知道只是个「看法」了,那我没啥好说的。就 C 和 Shell 的性能问题,我相信你心里有杆秤:你要硬说 Shell 就是能在服务管理的性能、功能和占用上替代 C ,我也没办法。我只知道嵌入式 Linux 很多都开始回归 systemd 了,我的印象里,16MB RAM 的板上系统跑裁剪版的 systemd 没有压力。
    w568w
        149
    w568w  
       186 天前
    提供一个 Systemd timer 的解法,在 /etc/systemd/system 下分别新建 myscript.service 和 myscript.timer 两个文件,填写以下内容:

    myscript.service:

    [Service]
    Type=simple
    ExecStart=/path/to/myscript.sh

    myscript.timer:

    [Timer]
    Unit=myscript.service
    OnUnitActiveSec=7m

    [Install]
    WantedBy=timers.target

    然后 sudo systemctl daemon-reload && sudo systemctl enable --now myscript.timer 。结束。

    以上内容手敲,不保证对。
    james122333
        150
    james122333  
       186 天前 via Android
    @w568w

    ram 占用也是一样的 systemd 主进程不算 还有很多子进程 要一并算在内
    还脑测程序性能... 我要额外装 systemd 再给你看证据? 证据自取好吗 做的事多占用大是正比 你能减低占用但占用还是会上升 依照 systemd 做的事情我不觉得这是很值得的 我宁愿组合性高并一样设法降低占用 如果你以上一堆人写脚本方式推估当然是效能差
    systemd 除了违背哲学以外还有 bug 以及漏洞问题 不是因为它只是违背哲学 而被视为污泥正是历史事件一步一步来的 以我所见相反 初学者反而觉得 systemd 好 而历史他们也不会知道 只有在这环境打滚久的会觉得 systemd 是垃圾
    "你太小看脚本"不正是你说的怎么做都不如 C 写的吗?两者相比也并不能以单方面来看
    至于 systemd timer 我看来还不如 cron
    换技术不会只有效能考量 你可以说 c 写的好的效能好过其它 但写的差的你也没讲 讲这种话我是觉得你应该不是开发 C 绝对好也是种暴论 而根据使用经验 效能也体验不出来的
    w568w
        151
    w568w  
       186 天前
    @james122333 #150

    > ram 占用也是一样的 systemd 主进程不算 还有很多子进程 要一并算在内

    我看了一下我的桌面端占用:一个 systemd 10MB ,一个 systemd user 进程 8.4MB 。还有什么「起服务调度作用」的「子进程」?

    另外注意比较公平:如果你认为 systemd-journald 、oomd 、resolved 等 systemd 模块也算 systemd 的一部分,那么请在计算 OpenRC 的占用时,把对应的进程也加上。毕竟 systemd 系统上是不需要那些进程的。

    ---

    > 还脑测程序性能 ... 我要额外装 systemd 再给你看证据?

    而我确实是有安装了 OpenRC 和 systemd 的服务器的,systemd 还是装在树莓派上的那个。需要我贴图给你比较两边的占用吗?我的结论是:两边占用差距不大,甚至 systemd 这边更小。

    ---

    > systemd 除了违背哲学以外还有 bug 以及漏洞问题

    ??你推崇的 Shell 没有 bug 和漏洞问题?

    ---

    > 只有在这环境打滚久的会觉得 systemd 是垃圾
    > 根据使用经验 效能也体验不出来的

    比资历和经验就没意思了,那你说得都对。

    ---

    > 但写的差的你也没讲

    systemd 是你说的「写的差」的吗?

    ---

    > 讲这种话我是觉得你应该不是开发 C

    我还真是写过 C 的,而且主要就是嵌入式。另外「我写没写过 C 、有几年经验」和我的回复对不对有什么关系?

    还是那句话,程序员用数据说话。不贴数据猛贴资历,那我没话说了,你说的都对。

    ---

    > 至于 systemd timer 我看来还不如 cron

    说了半天终于回主题上了,然而也没给任何证据,就一句「 xx 不如 yy 」。同上,不知道你想说什么。
    james122333
        152
    james122333  
       186 天前 via Android
    @w568w

    当然算在内 那些进程说实话用处都不大 openrc 也并不会主动帮你开服务 与 systemd 因应情况启动程序不同 有些发行版甚至还会主动帮你启动一些东西
    那你情况很特殊 我的使用情况是用小型 init 的占用都是极低 除非我开一些重量级应用直接盖过去
    shell 当然可能会有漏洞 但 systemd 影响层面高过 shell 太多 而 shell 写的本身也有一定隔离效果 除非恶搞乱写 而 shell 也很多 一个有漏洞换掉即可
    没在比资历 是看不懂是在科普是吗 其它人接不接受是另外一回事
    systemd 当然是属于写的差的 不是我一个人在讲
    我没填标点符号 C 开头那是另外一句 证据你有提供出来吗 讲证据是不是搞笑
    james122333
        153
    james122333  
       186 天前 via Android
    @w568w

    以纯设置来讲 cron 好过 systemd timer
    以哲学来讲 cron 是个别工具
    以效能来讲请补充
    skinny
        154
    skinny  
       186 天前
    既然不能可靠的每 7 分钟运行一次,那每分钟检查一次,保留最后一次运行时间,如果要确保只有一个实例就保存 PID 。这就是一种比较普遍可靠的方法。

    记录保存:
    /var/<mytask>/last_execute_time
    /var/<mytask>/<mytask>.pid

    程序基本逻辑就是先检查有没有其它实例在运行,然后检查当前时间和上次执行时间差。运行时保存时间戳和 PID 。
    idigital
        155
    idigital  
       186 天前 via iPhone
    试试 gpt 的回答
    要使用 `cron` 调度器在 Unix/Linux 系统中每 7 分钟执行一次脚本,可以通过以下步骤实现:

    1. **打开 Crontab 编辑器**:
    使用以下命令打开 crontab 文件进行编辑。`crontab` 是用户级任务计划文件,可以使用以下命令来编辑当前用户的 crontab:

    ```bash
    crontab -e
    ```

    2. **添加 Crontab 任务**:
    在 crontab 编辑器中添加以下行,表示每 7 分钟执行一次某个脚本。假设你的脚本在 `/path/to/your_script.sh`:

    ```cron
    */7 * * * * /path/to/your_script.sh
    ```

    这里,`*/7` 表示每 7 分钟执行一次任务。

    3. **保存并退出编辑器**:
    保存编辑并退出(具体的保存方式因不同的文本编辑器而异,例如在 `vim` 编辑器中是 `:wq`)。

    4. **确保脚本可执行**:
    确保你的脚本具有执行权限。如果没有,使用以下命令赋予可执行权限:

    ```bash
    chmod +x /path/to/your_script.sh
    ```

    例子解释:
    - `*/7 * * * *`:每 7 分钟执行一次任务。
    - 前一个星号 `*` 表示分钟的占位符。
    - 这里的 `/7` 表示每 7 分钟执行一次。
    - 其他的星号 `*` 分别代表小时、日期、月份和星期几,而它们保持星号代表任何时间。

    这样设置以后,cron 会根据定义的时间间隔每 7 分钟执行一次指定的脚本。

    ### 其它注意事项

    1. **查看 cron 日志**:
    如果你想要确认 cron 是否在按预期执行脚本,可以查看系统的 cron 日志。日志文件位置因系统配置而异,但一般为 `/var/log/cron` 或 `/var/log/syslog`。

    在某些系统中可能需要超级用户权限来查看这些日志,因此可以使用以下命令:

    ```bash
    sudo tail -f /var/log/cron
    ```

    或者

    ```bash
    sudo tail -f /var/log/syslog
    ```

    2. **检查 cron 任务**:
    如果要验证当前用户的 crontab ,包括编辑或列出已有的任务,可以使用以下命令列出任务:

    ```bash
    crontab -l
    ```

    通过这些步骤,你应该能够成功配置 cron 以每 7 分钟运行一次你的脚本。
    wuyadaxian
        156
    wuyadaxian  
    OP
       186 天前
    @yankebupt 不会超过 60 分钟或 24 小时。
    3/7 2/7 * * 3 command
    是很好的缩写。
    wuyadaxian
        157
    wuyadaxian  
    OP
       186 天前
    @BraveXaiver append 了。感谢提醒。
    fqzz
        158
    fqzz  
       185 天前
    换成 systemd timer 吧,cron 这么玩太折腾了
    huangzhiyia
        159
    huangzhiyia  
       184 天前
    value=$(echo $(( ($(cat /tmp/1045433_time 2>/dev/null || echo 0) + 1) % 7 )) > /tmp/1045433_time && cat /tmp/1045433_time) && [ "$value" -eq 0 ] && your_command_here
    huangzhiyia
        160
    huangzhiyia  
       184 天前
    上面每分钟执行一次就行了,第一次就会运行并输出到 0 ,每次运行命令后文件里的值执行以下逻辑:

    v=(v+1) % 7

    然后判断 v 是否等于 0 ,是的话就执行 your_command_here 命令。

    这个命令放在 crontab 可能会有点问题,可能需要加绝对路径以及对特殊的符合进行转义。
    esee
        161
    esee  
       184 天前
    用另外的脚本调用这个脚本执行不就行了。一定要纠结在 crontab 中运行这个吗
    hpkaiq
        162
    hpkaiq  
       183 天前
    每分钟执行,维护一个计数的文件或者其他的,每分钟加 1 ,如果等于 7 之行实际需要的逻辑,然后重置计数等于 0
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5354 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 09:27 · PVG 17:27 · LAX 01:27 · JFK 04:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.