我在Linux机器上有一个带有许多脚本的巨型crontab。我需要能够a)更改主题和/或cronjob结果电子邮件的主题,因为默认值太长了。b)通过集中式解决方案。c)仅需要对crontab本身进行最小的更改。
例如下面的crontab行:
0 */3 * * * /path/to/script1 | /path/to/script2 | /path/to/script3
创建此电子邮件主题:
Cron <cronuser@myserver> /path/to/script1 | /path/to/script2 | /path/to/script3
我的收件箱中的哪个被截断到script1路径中的某处。(而且crontab中的许多行都明显更长。)
我尝试过的选项: 管道发送邮件和设置主题等(每行(-E保留cron的默认“仅发送时发送”行为)):
0 */3 * * * /path/to/script1 | /path/to/script2 | /path/to/script3 2>&1 | mail -E -s "test subject" -S from="Cron Script2 <cronuser@myserver.com>" recipient@myserver.com
这个“有效”,但我想将更改集中在一个地方,并尽量减少添加到每个cron行中的可读性
使用shell:(noop)命令,该命令首先出现在主题中(请注意:之后的空格很重要!):
0 */3 * * * : Descriptive Words; /path/to/script1 | /path/to/script2 | /path/to/script3
不幸的是,cron在主题行的“描述性词”之前放置了太多不必要的内容,因此这仍然无法使用。
我要创建的内容: 通用的东西,像这样:
0 */3 * * * /path/to/script1 | /path/to/script2 | /path/to/script3 2>&1 | coolmailer.pl
coolmailer.pl可以通过在该cron行上获取命令来构建主题行,清除路径和参数,然后通过电子邮件将其发送给我(仅在任何脚本失败的情况下,才可以通过电子邮件发送给我):
SUBJECT: script1 | script2 | script3
FROM: Cron Script3<noreply@myserver.com>
(actual results of the command /path/to/script1 | /path/to/script2 | /path/to/script3)
另外,我也想说一下前面的命令(script1或script2)是否在主题行上失败了。
事实证明,这比我想象的要复杂得多。
确定管道 如果您始终coolmailer.pl使用唯一的参数进行调用,则可以简单地从cronjobs列表中对其进行grep调用:
> > #!/usr/bin/perl -wT
$ENV{PATH} = '/sensible:/path';
my ($pipeline) = grep /\|\s+$0\s+$ARGV[0]/, `crontab -l`;
$pipeline ||= "oops";
# ... mung $pipeline ...
# ... do mail stuff ...
检
查```
管道故障
如果您从以下位置重写cronjob条目:
```js
/path/to/script1 | /path/to/script2 | /path/to/script3 2>&1 | coolmailer.pl
至:
coolermailer /path/to/script1 \| /path/to/script2 \| /path/to/script3
那么您可以手动构建管道并控制管道成员状态信息。(这也直接为您提供了管道,尽管您随后必须构造它才能运行。)
例如,对于bash实现,您可以使用eval和PIPESTATUS。使用Perl,您可以results()在IPC :: Run中使用
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。