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

Aza*_*azo 13 bash cron file-organization crontab

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

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

迄今为止的问题示例:

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

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

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

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

如果我对这个问题的理解或布局感到困惑,那么我道歉,但是嘿 - 你看到了我的问题!我需要去从新手,知道怎样做才能得到这个正确的,并没有进一步搞砸了一个敏感的系统.谢谢!

Aza*_*azo 5

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

我正在慢慢地经历这一点,并试图实现每一点.在我的帖子之后,我没有想过谷歌的最佳实践.:P

对于版本控制,我将在此期间使用RCS,因为我在逐个文件的基础上编辑脚本,但我被建议设置Git(如果我在Windows系统上,则为Mercurial) ).

这实际上听起来很棒: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/


sar*_*old 3

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

我建议找到每天运行的所有任务并将它们推送到/etc/cron.daily/. 每周/etc/cron.weekly、每小时和每月也是如此。

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

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

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

可以通过设置禁用 cron 电子邮件MAILTO=""。我不确定我喜欢这个。也许设置MAILTO为仅记录帐户将有助于缓解洪流。另一种选择是真正熟悉您的procmail(1)规则,这样您就可以将它们完全放入另一个邮箱中。

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