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

时间:2011-04-13 10:55:18

标签: bash cron crontab file-organization

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

长期请求:我遇到了很多问题,但很多人使用cron文件等我觉得我必须缺少一些大型信息库,最佳实践和工具 - 或者这只是一种风格这种编程的区别? (我的偏见:如果我可以使用工具更快,更持续地做到这一点,为什么要手动执行某些操作?)。

到目前为止的问题示例:

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

    • 网上有很多(略显无意义的)“cron generator”。相反的地方在哪里?我可以在一个长的crontab,两个日期中输入的东西,并让它输出哪些进程应该运行,或者总共运行多少次? 这似乎在我微薄的脚本功能中,所以它不应该存在吗? ;)
    • 或者,如果我必须再次这样做,是否有某种方法可以调用bashscript以便将date()的任何实例预先设置为较早的时间,而不是更改脚本中的每个日期调用? (例如,所有错过的报告和结算发票)
  2. 事实证明,一份特定的报告已经运行了两年。它只是再次被要求,而且,它在crontab中! bash脚本刚刚破坏了对相关文件的路径引用。 我找不到:bash文件的某种路径检查器?像网站链接检查器。是的,我最终会手动完成这些操作,但它至少会显示一些问题区域。

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

  4. 还有大量基本无意义的电子邮件是从crontab生成的(脚本抛出错误但运行'正确',大部分都是静默失败,或只是打印非必要脚本的永久)。我会手动浏览脚本并试图让它们提供更多有用的数据,或者“安静地成功”,但是你知道 - 任何指导方针?

  5. 如果我对这个问题的理解或布局感到困惑,那么我道歉,但是嘿 - 你看到了我的问题!我需要从新手到知道如何做到这一点正确,而不是进一步搞砸了一个敏感的系统。谢谢!

2 个答案:

答案 0 :(得分:5)

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

我正在慢慢地经历这个,并试图实现每一点。在我的帖子之后,我没有想过谷歌的最佳实践。 :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/

答案 1 :(得分:3)

祝你好运,祝你好运,祝你好运。 :)

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

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

可以使用Ubuntu上的至少两个软件包将日期伪造成脚本:datefudgefaketime。我也没有任何经验,但听起来他们应该能够提供帮助。我希望你将来不需要它。 :)

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

可以通过设置MAILTO=""来停用cron电子邮件。我不确定我喜欢这个。将MAILTO设置为仅限日志记录的帐户可能有助于大量涌入。另一个选择是擅长你的procmail(1)规则,这样你就可以把它们完全填入另一个邮箱。

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