15

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

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

到目前为止的问题示例:

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

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

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

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

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

4

2 回答 2

5

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

我正在慢慢地经历这个,并试图实现每一点。直到我发帖后,我才想到谷歌“最佳实践 cron”。: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/

于 2011-04-18T22:02:06.780 回答
3

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

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

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

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

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

可以通过设置禁用 cron 电子邮件MAILTO=""。我不确定我喜欢这个。也许设置MAILTO为仅记录帐户会帮助洪水泛滥。另一种选择是非常擅长你的procmail(1)规则,这样你就可以把它们完全塞进另一个邮箱。

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

于 2011-04-13T11:16:04.003 回答