【问题标题】:Best practices for maintaining cronjobs and shell scripts?维护 cronjobs 和 shell 脚本的最佳实践?
【发布时间】:2011-08-04 14:45:31
【问题描述】:

我继承了需要维护和更新的庞大 crontab。我对它或 bash 脚本没有太多经验(我认为我已经掌握了基础知识),我想做得很好。 简短的请求:“重构”凌乱的 crontab 和一组 bash 脚本的任何指南

长请求:我遇到了很多问题,但有这么多人使用 cron 文件等,我觉得我一定错过了一些大型信息库、最佳实践和工具 - 或者这只是一种风格这种编程的区别? (我的偏见:如果我可以使用工具来更快、更稳定、更好地完成某件事,为什么还要手动执行?)。

到目前为止的问题示例:

  1. 由于外部事件,crontab 有几天没有运行。与其他人一起,我们手动浏览了列表,试图找出哪些没有运行,哪些需要重新运行,哪些脚本需要编辑和运行更早的日期等。 我找不到的:

    • 在线上有很多(有点毫无意义的)“cron 生成器”。反面在哪里?我可以输入一个很长的 crontab、两个日期,并让它输出哪些进程应该在什么时候运行,或者总共运行多少次? 这似乎在我微薄的脚本能力范围内,所以它不应该已经存在吗? ;)
    • 或者,如果我不得不再次这样做,是否有某种方法可以调用 bashscript,以便将 date() 的任何实例预设为更早的时间,而不是更改脚本中的每个日期调用? (例如,所有遗漏的报告和帐单)
  2. 事实证明,一个特定的报告已经两年没有运行了。只是再次请求它,瞧,它在 crontab 中! bash 脚本刚刚损坏了对相关文件的路径引用。 我找不到什么:bash 文件的某种路径检查器?就像一个网站链接检查器。是的,我最终会手动完成所有这些,但它至少会显示一些问题区域。

  3. 听起来有些时候,依赖进程之间的间隔要么太长要么太短,所以更新是在第一个运行之后发生的,或者第一个在第二个运行之前还没有完成运行叫。我已经看到了一些可能的选项(例如 anacron 按顺序运行),但是您会推荐什么?

  4. 还有大量从 crontab 生成的本质上毫无意义的电子邮件(脚本抛出错误但运行“正确”,大多是静默失败,或者只是打印非必要脚本的每一步)。我将手动浏览脚本并尝试让它们提供更有用的数据,或者“悄悄地成功”,但你知道 - 有什么指导方针吗?

如果我对问题的理解或布局有问题,那么我很抱歉,但是,嘿 - 你明白我的问题了!我需要从新手开始,知道该怎么做才能让这个正确,而不是进一步搞砸一个敏感的系统。谢谢!

【问题讨论】:

    标签: bash cron crontab file-organization


    【解决方案1】:

    不是完整的答案,而是更多有用的资源: http://blog.endpoint.com/2008/12/best-practices-for-cron.html

    我正在慢慢经历这件事,并尝试实施每一点。直到我发帖后,我才想到谷歌“最佳实践 cron”。 :P

    对于版本控制,我将同时使用 RCS,因为我逐个文件编辑脚本,但有人建议我设置 Git(或 Mercurial,如果我在Windows 系统)。

    这听起来确实很棒: http://everythingsysadmin.com/2010/09/xed-202-released.html “xed 是一个 perl 脚本,它锁定一个文件,在文件上运行 $EDITOR,然后解锁它。”......如果还没有,则将其放入 RCS。 完全无脑的版本控制。如果我对 bash 有所了解,我想创建一个编辑快捷方式,它会自动提交到我使用的任何版本控制系统。

    我从系统管理员那里收到的其他提示, 日期:与其使用 say、date 或 --date="last monday",不如使用固定日期并在每次运行时添加一天/周等(如果明显不超过当前日期),因为如果脚本不运行,我可以反复重新运行脚本,直到它赶上。啊! (而且,这听起来可能很明显,但是我最终会编辑大量报告,不要突出说报告的运行日期。会修复。)

    我确信我应该尽量让 cron 电子邮件尽可能安静,这样我才能真正注意到是否有错误电子邮件。 我还没有研究过更好的 cron 错误报告的包装器,链接在这里:http://habilis.net/cronic/

    【讨论】:

      【解决方案2】:

      你面前的任务艰巨,祝你好运。 :)

      我建议找到每天运行的所有任务并将它们推入/etc/cron.daily/ 中的自己的脚本中。每周到/etc/cron.weekly、每小时和每月都一样。

      如果机器不总是在线,您可能想要调查使用anacron(8) 来安排您的作业,但您仍然需要对作业何时运行进行一定程度的控制。几年来,它一直是多个发行版的默认 cron-helper-tool,因此希望它足够稳定,可以用于您自己的任务;但我很容易想象它可能无法完全满足您的需求。

      在 Ubuntu 上至少可以使用两个软件包来将日期伪装成脚本:datefudge 和 faketime。我两者都没有经验,但听起来他们应该能够提供帮助。我希望你以后不需要它。 :)

      抱歉,我知道 bash 脚本没有路径检查器。这似乎不太可能,因为简单的脚本很简单,而且很容易用肉眼检查 :) 并且复杂的脚本无论如何都会在运行时生成它们的路径名。也许您可以保留每个脚本使用的路径名数据库,并编写一个新脚本来定期验证该数据库。

      您可以通过设置 MAILTO="" 来禁用 cron 电子邮件。我不确定我喜欢这个。或许将MAILTO 设置为仅用于日志记录的帐户会有助于解决问题。另一种选择是非常擅长您的procmail(1) 规则,以便您可以将它们完全塞入另一个邮箱。

      精通mutt color 或score 控件可以帮助您在谷壳中发现小麦。 (color index red black ERROR 或类似的命令可能会帮助您更快地发现问题。)

      【讨论】:

      • 感谢您的建议。至少让人放心! “对不起,我知道没有 bash 脚本的路径检查器。这似乎不太可能,因为简单的脚本很简单,而且很容易用肉眼检查 :)” 哈哈哈哈!那好吧。 ;) Mutt 目前快把我逼疯了(HTML 电子邮件?简单。附在电子邮件中的 CSV 文件?简单。两者都有?荒谬!)所以无论如何我需要更好地了解它。
      猜你喜欢
      • 2018-08-26
      • 2017-12-22
      • 2010-09-25
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 2016-01-26
      • 2023-03-12
      相关资源
      最近更新 更多