【プログラミング】自宅サーバのバックアップスクリプトを改変
以前組んでここのblogにも晒した自作のバックアップスクリプトですが、
改めて見直したところなんか色々と突っ込む所があったので
(あとバグも発見されたので)全面的に手直しをすることにしました。
ちなみに仕様は
・newsyslogで7日ローテーションとして設定してあるログを
7日ごとにひとつのtarballにまとめる
・保存ディレクトリは/data/backup/logsに置く
・tarballの名前は「ログファイル名.取得日.tgz」とする
です。というわけで以下が改変版のソースコード。
ざっと見で怪しい点は見つからなかったから、後は実際に
回してみてどうなるかってところですね。
#!/usr/bin/perl
use strict;my $BKDIR = '/data/backup/logs';
my $LOGDIR = '/var/log';my @list;
my $listsrc;
my @logkind;
my $name;
my $i;
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
my $TODAY;$mday = sprintf("%02d", $mday);
$mon = sprintf("%02d", $mon + 1);
$TODAY = $year + 1900 . $mon . $mday;opendir LDIR, $LOGDIR or die "ERROR: Can't open logdir ($!)\n";
@list = grep /.*\.gz/, readdir(LDIR);
closedir LDIR;foreach $listsrc (@list) {
my $checked = 0;
my @logname = ();
chomp $listsrc;
$listsrc =~ s/\.[0-7]\.gz$//g;foreach (@logkind) {
if ($_ eq $listsrc) {
$checked = 1;
last;
}
}if ($checked) {
next;
}push @logkind, $listsrc;
for ($i = 0; $i < 8; $i++) {
my $setlog = "$LOGDIR/$listsrc.$i.gz";
if (-e $setlog) {
push @logname, $setlog;
} else {
last;
}
}$listsrc =~ s/\.log$//;
system ("tar", "zcf", "$BKDIR/$listsrc.$TODAY.tgz", @logname);if ($? >> 8 != 0) {
warn "making 'tar' archive failed.\n";
warn "($listsrc.log)\n";
}}
exit 0;