Perl,确定STDIN的来源

时间:2013-01-17 04:42:21

标签: perl cron stdin stderr

我们有许多cron作业,可以在相当大的网络上收集各种统计数据。大多数这些cron工作都没有得到很好的监控。我想编写一个perl脚本,我们可以将这些作业的输出管道输入,如下所示:

5 * * * * collectstats.pl 2>&1 1>/dev/null | scriptwatcher.pl

这个想法是来自collectstats.pl的stdout被丢弃,stderr被传送到scriptwatcher.pl。然后,第二个脚本可以在出现错误时采取适当的措施,最有可能给我发电子邮件。通过快速测试,这是有效的,除了在scriptwatcher中我需要知道发送错误的脚本的名称。只需要这一小部分信息,我想做的一切就成为可能。

另外,是否可以同时将stodout从collectstats传递到另一个脚本?即一个脚本的2个管道?

干杯

2 个答案:

答案 0 :(得分:4)

转过身去做:

5 * * * * scriptwatcher.pl collectstats.pl any extra args

让你的scriptwatcher.pl处理重定向并运行其args中给出的脚本。

答案 1 :(得分:1)

使用以下行:

5 * * * * collectstats.pl 2>&1 1>/dev/null | scriptwatcher.pl collectstats.pl

也就是说,告诉脚本观察者它正在观看哪个脚本。

或者,正如ysth在其answer中建议的那样,让scriptwatcher运行应该观看的脚本,例如nohupsu等等可以为你运行其他命令。这可以避免您必须两次命名脚本。如果重复是个问题,请选择ysth的答案。

关于你的辅助问题:

  

是否可以同时将来自collectstats的stdout传递到另一个脚本?

查找pee命令,与tee并行,但使用进程(因此为p)而不是文件。 (小心:'小便命令'不是一个很好的谷歌搜索术语,但我指向的URL是一个SO答案,有关它的更多信息和直接链接到你可以找到代码的地方等。)