维护cronjobs和shell脚本的最佳实践?

15

我需要维护和更新一个复杂的crontab。虽然对基本概念有一定了解,但是对它和bash脚本的使用经验不多,因此我想做得更好。短期要求:有没有关于“重构”混乱的crontab和一堆bash脚本的指南?

长期要求:我遇到了许多问题,但是有这么多人使用cron文件等,我感觉可能会错过某些重要信息,最佳实践和工具-还是这仅仅是这种编程风格上的差异?(我的偏见:如果可以使用工具更快,更一致地完成任务,为什么要手动操作呢?)

以下是一些问题示例:

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

    • 有很多(有点无意义的)在线'cron生成器'。是否存在相反的工具?我可以输入一个长长的crontab,两个日期,然后输出应该在何时运行哪些进程或总共运行多少次? 这似乎在我的有限脚本能力范围内,所以它不应该已经存在吗? ;)
    • 或者,如果我必须再次这样做,是否有一种调用bash脚本的方式,使任何date()实例都预设为较早时间,而不是更改脚本中的每个日期调用?(例如,对于所有错过的报告和账单发票)
  2. 原来一个特定的报告已经两年没有运行了。最近又被要求运行,结果在crontab 中找到了它!但是bash脚本只是指向相关文件的错误路径。 我找不到的内容:针对bash文件的某种路径检查工具?就像网站链接检查器一样。是的,我最终会手动检查所有问题,但至少可以显示出部分问题区域。

  • 听起来有时候依赖进程之间的间隔时间过长或者过短,导致更新在第一个进程运行后发生,或者第一个进程在第二个被调用之前还没跑完。我看到了一些可能的解决方案(例如anacron按顺序运行),但您会推荐什么呢?

  • 另外,由crontab生成了大量无实际意义的电子邮件(脚本抛出错误但“正确”运行,大多数情况下默默失败,或者只打印非必需脚本的每一步)。我将手动检查脚本,并尝试让它们提供更有用的数据,或者“安静成功”,但是,你懂的 - 有任何指导方针吗?

  • 如果我对问题的理解或布局混淆了,那么我很抱歉,但嘿 - 您看到我的问题了!我需要从新手变成知道该怎么做才能做得,而不会进一步破坏敏感系统。谢谢!

    2个回答

    5

    虽然不是完整的答案,但以下资源可能会有所帮助: http://blog.endpoint.com/2008/12/best-practices-for-cron.html

    我正在逐步阅读并尝试实现每个要点。在发布后我才想到用Google搜索“cron最佳实践”。:P

    至于版本控制,我暂时只使用RCS,因为我按文件逐个编辑脚本,但有人建议我设置Git(如果我使用Windows系统则使用Mercurial)。

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

    其他收到的提示: 日期:不要使用例如date或--date =“last monday”,而是使用固定日期,并在每次运行时添加一天/一周等时间(如果不超过当前日期),因为如果脚本未运行,则可以重复运行脚本,直到追上。啊! (这可能很明显,但我将来要编辑的大量报告并没有明确说明报告运行的日期。我会修复它。)

    还有人向我保证应尽可能使cron电子邮件安静,以便我实际上注意到是否有错误邮件。 有更好的cron错误报告包装器,我还没有调查过,此处链接:http://habilis.net/cronic/


    3
    你面临的任务艰巨,祝你好运。:)
    我建议将所有每日运行的任务放到/etc/cron.daily/自己的脚本中。对于每周任务,也是这样放到/etc/cron.weekly,按小时和按月运行同理。
    如果机器不总是在线,但仍需要对作业运行时间有一定控制,您可能需要调查使用anacron(8)来安排作业。它已经成为多个发行版的默认cron-helper-tool几年了,所以希望它足够稳定,可以用于自己的任务; 但我很容易想象它可能无法完全满足您的需求。
    在Ubuntu上,可以使用至少两个软件包来伪造脚本日期:datefudgefaketime。我没有使用过其中任何一个,但两者都应该能够提供帮助。希望你将来不需要这样做。:)
    很抱歉,我不知道有哪些bash脚本路径检查器。这似乎不太可能,因为简单的脚本可以通过肉眼检查得出,而复杂的脚本将在运行时生成其路径名。也许您可以保留每个脚本使用的路径名的数据库,并编写一个新的脚本定期验证该数据库。
    您可以通过设置MAILTO =“”来禁用cron电子邮件。我不确定我喜欢这个选项。或许将MAILTO设置为仅记录的帐户可以帮助你避免过多的邮件。另一种选择是熟练掌握procmail(1)规则,以便可以将它们完全放入另一个邮箱中。
    熟练使用muttcolorscore控制功能可以帮助您在混杂不清的信息中快速发现问题。(例如使用color index red black ERROR等命令可能有助于您更快地发现问题。)

    谢谢你的建议,至少让我感到安心!抱歉,我不知道有哪些适用于bash脚本的路径检查器。这似乎不太可能,因为简单的脚本可以通过肉眼轻松检查 :) 哈哈哈哈!好吧,那就算了。Mutt目前让我疯狂(HTML电子邮件?容易。附加在电子邮件中的Csv文件?容易。两者都有?荒谬!),所以我需要更好地学习它的使用方法。 - Azazo

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接