我怎样才能拦截gzip中的错误,所以cron看不到它们?

时间:2009-06-05 20:05:02

标签: perl shell scripting cron

所以,好吧,作业在cron中运行:它获取压缩文件并处理它们。如果文件已损坏,则会删除它们。有时它们在远程服务器上很糟糕,在这种情况下,每次都会下载和删除它们。

我的cron广泛记录到STDOUT(指向.crontab中的logfile),仅使用STDERR导致脚本停止的事情:我喜欢在发生坏事时从cron收到电子邮件;只是损坏的文件不应该在此列表中。

我需要'gunzip'的输出来告诉我文件是否已损坏。但是,我厌倦了每次遇到错误的文件时都会收到来自cron的电子邮件。如何调用'gunzip'以便错误不会触发来自cron的电子邮件,同时仍然让调用'gunzip'的脚本知道它失败了?

这可能是一个非常简单的,但我对这个cron的东西很新。

重要PS:使用

从Perl脚本调用'gunzip'
$gunzip_result=system("gunzip $gzfile");
if($gunzip_result){
  print,"$gzfile is bad: deleting...\n"; 
  unlink $gzfile;
};

4 个答案:

答案 0 :(得分:5)

您可能会考虑使用具有更好错误控制和处理功能的IO::Uncompress::Gunzip。以下是可能有用的代码段:

use IO::Uncompress::Gunzip qw(gunzip $GunzipError);

eval (
     gunzip $infh => $outfh or die $GunzipError
);
if $@ <do something with $GunzipError>

$ GunzipError叙述出了什么问题

答案 1 :(得分:0)

我没有测试它,但是类似的东西:

  $gunzip_result=system("gunzip $gzfile 2>/dev/null");

答案 2 :(得分:0)

您可以使用IPC::Run3

run3(['gunzip', $gzfile], \undef, undef, \$stderr);
# close stdin, use existing stdout, redirect stderr
$gunzip_result = $? >> 8;
if($gunzip_result){
    print,"gunzip $gzfile is bad: ($stderr) deleting...\n"; 
    unlink $gzfile;
};

答案 3 :(得分:-1)

在你的crontab中,你可以说

* * * * * foo.pl 2> /var/log/foo.pl.log

Cron不会再看到错误了,但你仍然可以找到它们。