crontab 定时任务的增强管理 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个专门讨论 idea 的地方。

每个人的时间,资源是有限的,有的时候你或许能够想到很多 idea,但是由于现实的限制,却并不是所有的 idea 都能够成为现实。

那这个时候,不妨可以把那些 idea 分享出来,启发别人。
marquina
V2EX    奇思妙想

crontab 定时任务的增强管理

  •  
  •   marquina 2023-01-17 17:51:42 +08:00 3228 次点击
    这是一个创建于 1003 天前的主题,其中的信息可能已经有所发展或是发生改变。

    OP 运行了不少 crontab 定时任务,一个痛点是很难主动发现定时任务的异常,往往是等未看到执行成功的结果才知道定时任务跑不起来。

    经过一番搜寻,OP 目前发现了两种主动发现定时任务异常的思路:

    1. 定时任务执行成功后上报结果,服务端发现长时间无结果后进行告警,如Cron Job Monitoring - Healthchecks.io。缺点在于需要侵入定时任务代码。
    2. 使用 crontab 自带的 MAILTO 功能,屏蔽 stdout 并重定向 stderr 后,定时任务的异常输出可发送至指定邮箱。缺点在于需要侵入定时任务的输出设置,并且无法对异常进行聚合。

    所以 OP 想开发一个工具来管理定时任务。通过识别定时任务的 stderr/exit code ,工具可在 连续 M 次执行失败 /过去 N 分钟未成功执行 之类的场景下发送邮件 /telegram 等告警。这样定时任务就可以不用做啥改动了。

    其他一些 OP 没有强烈需求但可能有用的功能:

    • 任务手动执行
    • 超时控制 /重试
    • 版本控制
    • 执行历史(日志输出 /耗时)
    • web-UI 管理(如crontab-ui
    • 接入 metrics

    Q: 为啥不用青龙面板?

    A: 青龙面板看起来是单独做了一套执行环节(需要手动指定依赖),而笔者倾向于远程在 linux server 上开发+调试完后用相同的环境运行 crontab ,不然安装 chrome-driver 等比较重的依赖会比较麻烦。

    大家怎么看?

    17 条回复    2023-01-30 00:03:40 +08:00
    perfectlife
        1
    perfectlife  
       2023-01-17 18:05:59 +08:00
    啥时候开发,我 star 一下
    f5c4ebc2
        2
    f5c4ebc2  
       2023-01-17 19:42:31 +08:00 via Android
    感觉这个想法挺好的,我也有类似的需求,但目前碰到的情况基本都可以通过 OP 提到的第一种方法解决,代码侵入性问题可以通过类似装饰器的方法在一定程度上解决。

    另一种现成的方法是用云函数,设置一下自动告警的规则就可以了,比较灵活方便。
    37Y37
        3
    37Y37  
       2023-01-17 20:04:43 +08:00 via Android
    我做过类似的,功能更强大,跑下来也比较稳定,看看是不是有参考的价值 https://blog.ops-coffee.cn/s/yjftypchd03ftglv_jsqww
    chuanqirenwu
        4
    chuanqirenwu  
       2023-01-17 21:07:30 +08:00
    无侵入式的实现方案有了吗?
    815979670
        5
    815979670  
       2023-01-18 01:27:32 +08:00
    @37Y37 我有个类似的想法构思,看你的文章挺有参考价值的。
    我想尝试 sqlite + 单个主程序的方式 用一个小而美的形态来实现这个
    ft3312591
        6
    ft3312591  
       2023-01-18 09:56:22 +08:00
    有没有纯粹一点只有 crontab 远程执行的东西,我只想把所有脚本都统一放在一起,管理方便
    marquina
        7
    marquina  
    OP
       2023-01-18 10:29:33 +08:00
    @ft3312591 控制其它服务器上的 crontab ?
    marquina
        8
    marquina  
    OP
       2023-01-18 10:30:45 +08:00
    @37Y37 这个看起来是企业级解决方案?对于个人 crontab 使用场景来说可能有点太重了
    marquina
        9
    marquina  
    OP
       2023-01-18 10:31:07 +08:00
    @chuanqirenwu 没呢,所以准备做一个
    chuanqirenwu
        10
    chuanqirenwu  
       2023-01-18 17:33:28 +08:00
    @marquina 方案都没有怎么实现呀?我最近也在做类似的东西,仿照的 healthchecks.io 的做法,不知道无侵入式应该怎么实现呢?
    marquina
        11
    marquina  
    OP
       2023-01-18 18:32:17 +08:00 via Android
    @chuanqirenwu 技术细节的话帖子里说了一部分。新流程下该工具会充当 crontab 和执行命令的中间层,工具执行完命令后会检查 stderr 和 exit code ,判断是否成功。
    chuanqirenwu
        12
    chuanqirenwu  
       2023-01-18 20:19:15 +08:00
    哦哦,那就类似于 ansible 或者 AWX 了,需要自己集成调度器。
    julyclyde
        13
    julyclyde  
       2023-01-19 09:40:24 +08:00
    yet another
    marquina
        14
    marquina  
    OP
       2023-01-19 19:42:46 +08:00
    @julyclyde 啥意思
    ft3312591
        15
    ft3312591  
       2023-01-21 11:03:13 +08:00
    @marquina 不是控制,就是定时在一台机器上,定时远程 ssh 去执行脚本,有没有这种管理 web 系统?
    marquina
        16
    marquina  
    OP
       2023-01-30 00:02:59 +08:00
    #15 @ft3312591 https://github.com/ouqiang/gocron 采用中控节点+执行节点的架构设计,应该是能满足你的需求的
    marquina
        17
    marquina  
    OP
       2023-01-30 00:03:40 +08:00
    发现开源项目 ouqiang/gocron ,整体比较重,但从功能上来说基本满足我的需求了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2933 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 13:12 PVG 21:12 LAX 06:12 JFK 09:12
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86