【问题标题】:Perl, determine where STDIN is coming fromPerl,确定 STDIN 来自哪里
【发布时间】:2013-01-18 06:31:53
【问题描述】:

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

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

这个想法是丢弃来自 collectstats.pl 的标准输出,并将标准错误传送到 scriptwatcher.pl。然后,第二个脚本可以在出现错误时采取适当的措施,很可能给我发电子邮件。通过快速测试,这是可行的,除了在 scriptwatcher 中我需要知道发送错误的脚本的名称。只需这一点点信息,我想做的一切都成为可能。

另外,是否可以同时将标准输出从 collectstats 传送到另一个脚本?即一个脚本有 2 个管道?

干杯

【问题讨论】:

  • 使用线路:5 * * * * collectstats.pl 2>&1 1>/dev/null | scriptwatcher.pl collectstats.pl。也就是说,告诉脚本观察者它正在观察哪个脚本。查找pee 命令,与tee 平行,但使用进程(因此是p)而不是文件。
  • @JonathanLeffler 如果可能的话,我想避免重复输入 collectstats.pl。如果没有其他可能,那么这就是我需要做的,但最好避免它。
  • 哈哈,尝试在谷歌中输入“pee command”,不是我所期望的!!
  • cron 已经可以通过电子邮件将发送给 STDERR 的内容发送给 STDERR,仅供参考
  • @ikegami 谢谢,很高兴知道。但是,我希望有更多的控制权,例如它会在 x 小时后发送一条短信。这确实让我觉得也许有一个包可以处理这种事情。

标签: perl cron stdin stderr


【解决方案1】:

把它转过来做:

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

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

【讨论】:

  • 谢谢ysth,我可以看到的问题是,如果 scriptwatcher 由于任何原因失败,那么所有 cron 作业都会停止工作。这是非常非常糟糕的,尤其是因为这将是我的错。但是,如果反过来,即使 scriptwatcher 失败,collectstats 仍然会运行。
  • 到 scriptwatcher 的管道也是如此。事实上,我认为运行另一个作业的 scriptwatcher 稍微安全,如果你让它执行将 stderr 写入临时文件而不是管道的作业。
【解决方案2】:

使用线路:

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

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

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

关于你的辅助问题:

是否可以同时将标准输出从 collectstats 传送到另一个脚本?

查找pee 命令,与 tee 平行,但使用进程(因此是 p)而不是文件。 (注意:“小便命令”不是一个好的 Google 搜索词,但我指向的 URL 是一个 SO 答案,其中包含更多信息以及指向您可以找到代码的位置的直接链接等)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2013-02-08
    相关资源
    最近更新 更多