V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
wuyadaxian
V2EX  ›  程序员

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

  •  4
     
  •   wuyadaxian · 2024-05-30 16:47:00 +08:00 · 18481 次点击
    这是一个创建于 460 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我的环境是 Ubuntu 22.04LTS 。
    要求是从现在或者某个时间点开始,每 7 分钟执行一次 test.sh 脚本。
    只能使用 crontab 来编写。
    只是讨论,真正实现的时候肯定用 bash 或者其他语言脚本更方便实现。
    第 1 条附言  ·  2024-06-01 12:12:52 +08:00
    -------------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 条附言  ·  2024-06-01 12:26:30 +08:00
    根据#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  
       2024-05-31 09:29:50 +08:00
    @superrichman #12 学到了
    hero1874
        102
    hero1874  
       2024-05-31 09:53:59 +08:00
    还是得写脚本吧 cron 不行
    p1gd0g
        103
    p1gd0g  
       2024-05-31 09:55:17 +08:00
    歪个楼,不能改 sh 那能不能套一层 sh 呢。我看评论里的 cron 未免也太复杂了
    josephok
        104
    josephok  
       2024-05-31 09:58:10 +08:00
    X-Y problem
    josephok
        105
    josephok  
       2024-05-31 09:58:55 +08:00   ❤️ 1
    V2IEX
        106
    V2IEX  
       2024-05-31 10:12:49 +08:00
    cron 每分钟执行一次,代码里记录执行次数 n ,if(n%7)==0 执行代码
    EndlessMemory
        107
    EndlessMemory  
       2024-05-31 10:20:52 +08:00
    穷举居然是最可靠的
    channg
        108
    channg  
       2024-05-31 10:35:40 +08:00
    没想到真能学到知识
    CHTuring
        109
    CHTuring  
       2024-05-31 10:51:36 +08:00
    啊,以前从没想过 cron 的这种知识,都是网页生成一个就用了。
    Goooooos
        110
    Goooooos  
       2024-05-31 10:51:47 +08:00
    #!/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  
       2024-05-31 11:04:22 +08:00
    什么年代了
    早就该换 systemd 了
    mingwiki
        112
    mingwiki  
       2024-05-31 11:10:11 +08:00
    @dna1982 #111 systemd 太大了,我就喜欢 openrc 这种,只不过定时任务这块我不用 crontab,我倾向于写 python 脚本。
    baoshijiagong
        113
    baoshijiagong  
       2024-05-31 11:12:08 +08:00   ❤️ 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  
       2024-05-31 11:16:50 +08:00
    加一层或者穷举
    dna1982
        115
    dna1982  
       2024-05-31 11:23:28 +08:00
    @mingwiki #112 什么系统不带 systemd 啊。我用的 Debian ( 11 还是 12 忘了)连 SSH 服务都是 systemd 的了。
    Huelse
        116
    Huelse  
       2024-05-31 11:28:30 +08:00
    https://tool.lu/crontab/ 验证 `*/7 * * * *`确实不行,到整点就不对了,
    换个思路,每分钟执行,在/tmp 存下时间,如果距离上次执行大于等于 7 分钟了就执行 sh
    wuyadaxian
        117
    wuyadaxian  
    OP
       2024-05-31 12:04:20 +08:00
    @baoshijiagong 因为之前查了资料,有系统环境差异。
    比如#51 楼提到的,macOS 下 crontab 和 linux 下 crontab 就可能会不一样。
    而且有些特别的 arm 芯片上的特定版本 os 下的 crontab 也可能有差异。
    我考虑的是尽可能说出相关环境,用于实践测试。
    wuyadaxian
        118
    wuyadaxian  
    OP
       2024-05-31 12:12:00 +08:00
    @baoshijiagong
    你可以把它看做一道面试/考试题。
    你进入正在一个面试/考试,电脑画面已经打开了 crontab -e 。
    考题是每 7 分钟执行一次 test.sh
    已经确认 user 对 test.sh 有读写运行权限。
    一旦你关闭这个编辑界面面试/考试即结束。
    -----------------------------------------------------
    以上是我瞎编的。
    我并不是想解决任何实际问题。
    毕竟实际问题上不会存在这么奇葩的要求,一般 */5 * * * * command 就够用了。
    wuyadaxian
        119
    wuyadaxian  
    OP
       2024-05-31 12:35:09 +08:00   ❤️ 1
    @noyle #96 it works!!!!
    感谢#96 楼,需要注意#96 楼提到的两点问题。

    我使用下面的代码:
    * * * * * [ $(($(date +\%s) / 60 \% 1 )) -eq 0 ] && ( /etc/test.sh )
    ww2000e
        120
    ww2000e  
       2024-05-31 12:37:32 +08:00
    这种问大模型就行。。
    darkengine
        121
    darkengine  
       2024-05-31 12:54:23 +08:00
    sh 不能修改。
    ------

    自己写个脚本把这个 sh 包起来,新脚本每分钟跑一次,然后判断是否过了 7 分钟,是就调用这个目标 sh 就好了
    wuyadaxian
        122
    wuyadaxian  
    OP
       2024-05-31 12:59:36 +08:00   ❤️ 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  
       2024-05-31 13:28:43 +08:00
    @hackerwgf #99 是吧,这个帖子氛围真好
    Felldeadbird
        124
    Felldeadbird  
       2024-05-31 13:37:30 +08:00
    啊,涨知识了。cron 原来不被整除就 跑不了啊。我系统好多这样的设置。
    janus77
        125
    janus77  
       2024-05-31 13:41:28 +08:00
    你在 sh 外面再包一层 sh 然后里面判断时间就行了吧
    banyasmya23
        126
    banyasmya23  
       2024-05-31 13:45:40 +08:00
    @bthulu #15 那用啥
    msg7086
        127
    msg7086  
       2024-05-31 13:55:13 +08:00
    cron 只能穷举,systemd-timer 让 AI 生成两个文件往服务器里一塞,一分钟搞定。
    xqzr
        128
    xqzr  
       2024-05-31 13:58:47 +08:00
    @Livid #22 Ai
    LXGMAX
        129
    LXGMAX  
       2024-05-31 15:28:12 +08:00
    while
    do
    if now - last > 7 * 60:
    run
    done

    /doge
    D33109
        130
    D33109  
       2024-05-31 15:38:28 +08:00
    每分钟执行一次 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  
       2024-05-31 15:42:57 +08:00
    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  
       2024-05-31 15:48:34 +08:00
    */7
    每小时的 0 分、7 分、14 分、21 分、28 分、35 分、42 分、49 分、56 分
    realpg
        133
    realpg  
    PRO
       2024-05-31 15:54:51 +08:00
    cron + at
    已运行超过 6 年 无差错 无漏执行
    wanqingfengtao
        134
    wanqingfengtao  
       2024-05-31 16:24:40 +08:00
    歪个楼,OP 考虑这么多,考虑闰秒了吗?🤪
    wuyadaxian
        135
    wuyadaxian  
    OP
       2024-05-31 16:34:44 +08:00
    @wanqingfengtao 哈哈哈。没有。
    全部交给 NTP 。
    yankebupt
        136
    yankebupt  
       2024-05-31 19:04:04 +08:00
    @wuyadaxian 还真的,小时也可以用除 7 偏移量,只想到分钟可以,脑子瓦特了
    guanzhangzhang
        137
    guanzhangzhang  
       2024-05-31 19:08:33 +08:00
    @lolizeppelin #47 +1 ,看了 40 多层,才看到有人提 systemd 的 timer
    yankebupt
        138
    yankebupt  
       2024-05-31 19:12:28 +08:00   ❤️ 1
    @wuyadaxian 对了问个问题
    比如周三这条
    3-59/7 2-23/7 * * 3 command
    不加-23 或者-59 会怎样?会超过 60 分钟或 24 小时么?
    sampeng
        139
    sampeng  
       2024-05-31 19:24:30 +08:00 via iPhone
    其实如果是我…我会改成 6 分钟或者 5 分钟。然后去怼提出这个需求的人。
    jevonszmx
        140
    jevonszmx  
       2024-05-31 22:50:21 +08:00
    我一般是每分钟执行,然后代码里面控制真正的逻辑
    honjow
        141
    honjow  
       2024-05-31 23:44:55 +08:00
    @Felldeadbird #124 能跑啊。。。只是不能整除的话,最后一次间隔就不对啊
    w568w
        142
    w568w  
       2024-06-01 00:12:10 +08:00   ❤️ 1
    @mingwiki 必须纠正一个误区:systemd 可能确实看起来功能很多,但毕竟是用 C 写的,实际上是非常轻量的:本身完全体只占用不到 10MB 内存、CPU 占用接近 0 。OpenRC 之类靠 Shell 程序的解决方案,怎么做都不如 C 性能高、占用小、功耗低。如果只看占用和功能,实际上服务和需求多起来,OpenRC 占不到多少便宜,对服务的控制力度还小得多。

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

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

    再给你个看法 一个东西能性能高占用小 语言只是其中一个因素 很多时后更重要的还是在于你怎么写
    james122333
        147
    james122333  
       2024-06-01 00:47:04 +08:00 via Android
    @w568w

    C 语言上限高不代表用 C 写的都是好货
    w568w
        148
    w568w  
       2024-06-01 01:02:15 +08:00
    @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  
       2024-06-01 01:14:43 +08:00
    提供一个 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  
       2024-06-01 01:31:15 +08:00 via Android
    @w568w

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

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

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

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

    程序基本逻辑就是先检查有没有其它实例在运行,然后检查当前时间和上次执行时间差。运行时保存时间戳和 PID 。
    idigital
        155
    idigital  
       2024-06-01 09:03:39 +08:00 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
       2024-06-01 12:16:56 +08:00
    @yankebupt 不会超过 60 分钟或 24 小时。
    3/7 2/7 * * 3 command
    是很好的缩写。
    wuyadaxian
        157
    wuyadaxian  
    OP
       2024-06-01 12:23:34 +08:00
    @BraveXaiver append 了。感谢提醒。
    fqzz
        158
    fqzz  
       2024-06-02 14:23:23 +08:00
    换成 systemd timer 吧,cron 这么玩太折腾了
    huangzhiyia
        159
    huangzhiyia  
       2024-06-03 12:52:05 +08:00
    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  
       2024-06-03 12:58:36 +08:00
    上面每分钟执行一次就行了,第一次就会运行并输出到 0 ,每次运行命令后文件里的值执行以下逻辑:

    v=(v+1) % 7

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

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