所以,好吧,作业在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;
};
答案 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不会再看到错误了,但你仍然可以找到它们。