具体问题:
邮递员附带一个脚本,用于从平面文件同步邮件列表订阅者(同步成员(8))。
该脚本没有很好地遵守沉默规则。例如,当没有什么可做时(例如当前订阅者和平面文件相同),它会打印“Nothing to do”。到stdout
。
当我们每隔几分钟运行这个程序时,任何输出都会记录到我们的日志服务器(带有系统日志)然后每天发送带有日志的电子邮件,其中往往有很多无用的消息。
有几种方法可以解决这个问题,我想知道哪一种是最合适的:
- 管道
stdout
到/dev/null
. - 使用rsyslogd 过滤专门过滤掉这些消息。
- 修改源代码以
sync_members
遵守沉默规则。 - 复制 的源代码
sync_members
,修改副本并从现在开始使用该副本。
虽然每种方法都能达到预期的结果,但每种方法都有其缺点:
- 如果某个时候有一些有趣的事情怎么办
stdout
? - 似乎是一个相当“不干净”和“黑客”解决方案,我敢说我们那里有很多程序不遵守沉默规则。
- 如果有更新会发生什么?
- 与3相同。
我倾向于选择 2,但如果我必须对我们系统中的每个行为不良的程序都执行此操作...
你怎么认为?是否还有支持或反对的其他选项或论点?对于这种情况是否有最佳实践(我敢说这个问题并不新鲜)?
答案1
您缺少选项 5:编写一个包装脚本来重定向输出sync_members
并检查它是否是“无事可做”。
通过正确的退出代码检查,这可以很好地完成工作。它相对升级安全 - 只要“无”消息不改变,您的脚本就不必维护。
您可以决定如何处理该脚本中的错误情况(即仅cat
处理日志文件,或者做一些更有趣的事情)。
答案2
两个建议:
提交错误报告
mailman
,以便开发人员可以为每个人修复错误。将调用更改
synch_members
为synch_members | egrep -v "Nothing to do."
That 将消除“无事可做”。消息。
答案3
如果“无事可做”没有变化(或者可以简化为正则表达式),您可以像这样使用 grep :
grep -v "Nothing to do" *.log
从现在开始,您可以采取很多措施来解决您的问题:
- 重定向上述命令的输出以创建新的“静默”日志。
- 根据上述命令定义函数和别名,以用作交互式会话中的快捷方式(您甚至可以定义“无事可做”作为环境变量)。
- 定义
cron
将定期自动执行此类命令的作业。
使用基本的 Unix 工具和现代 shell 可以做很多事情。我认为现在决定修改源代码还为时过早。保持简单,这样可以避免浪费很多时间。