Как я могу перехватить ошибки из gzip, чтобы cron их не видел? - PullRequest
0 голосов
/ 06 июня 2009

Итак, хорошо, задание выполняется в cron: оно выбирает сжатые файлы и обрабатывает их. Если файлы повреждены, он удаляет их. Иногда они плохо работают на удаленном сервере, и в этом случае они будут загружаться и удаляться каждый раз.

Мой cron интенсивно регистрируется в STDOUT (направлен на файл журнала в .crontab), используя STDERR только для вещей, которые вызывают остановку скрипта: мне нравится получение писем от cron при возникновении плохих вещей; просто в этом списке не должно быть поврежденных файлов.

Мне нужен вывод 'gunzip', чтобы сказать мне, если файл поврежден. Тем не менее, я устал получать электронные письма от cron каждый раз, когда он сталкивается с плохим файлом. Как мне вызвать 'gunzip', чтобы ошибки не вызывали электронные письма от cron, и в то же время сообщать сценарию, который вызывает 'gunzip', что он не прошел?

Вероятно, это довольно легко, но я немного новичок в этом материале cron.

Важный PS: 'gunzip' вызывается из сценария Perl, используя

$gunzip_result=system("gunzip $gzfile");
if($gunzip_result){
  print,"$gzfile is bad: deleting...\n"; 
  unlink $gzfile;
};

Ответы [ 4 ]

5 голосов
/ 06 июня 2009

Вы можете рассмотреть возможность использования IO :: Uncompress :: Gunzip , который имеет лучший контроль и обработку ошибок. Вот фрагмент кода, который может помочь:

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

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

$ GunzipError рассказывает, что пошло не так

0 голосов
/ 09 июня 2009

Вы можете использовать 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;
};
0 голосов
/ 06 июня 2009

В вашем crontab вы можете сказать

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

Крон больше не будет видеть ошибки, но вы все равно сможете их найти.

0 голосов
/ 06 июня 2009

Я не проверял это, но что-то вроде:

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