Аз програма не знам, но ето скрипт, който използвам за архивиране. Понеже архивирам много папки, използвам няколко скрипта, но на теб са ти достатъчни тези три, които ще ти покажа след малко. Понагласил съм ги, но все пак твоите пътища е възможно да са различни. Като начало, направи си една папка /usr/local/backup и сложи скриптовете там, като след това направиш файловете изпълними.
Ето го първия. Този го кръсти conf.pl
Цитат |
#!/usr/bin/perl
$tarpath = "/home/backup";
##If you want to timestamp the filename, select this as 1, otherwise 0;
$date_yes = 1;
## samo ahrhivirane, bez ftp transfer
$just_back_up = 0; $delete_source = 0;
$ftpserver = "111.222.333.444"; $ftpusername = "username"; $ftppass = "password";
$notify = 1;
#path to sendmail
$sendmail = "/usr/sbin/sendmail";
##email address:
$to = 'your@email.address';
##Who will the email address be from
$from = 'some@email.address'; |
В този файл ще описваш настройките за архивиране. Нагласил съм $just_back_up = 0;
$delete_source = 0;
за да имаш едновременно копие в компютъра, от който се изпълнява скрипта и копие на някой ftp сървър.
Следващият скрипт го кръсти arh_mysql.pl
Цитат |
#!/usr/bin/perl
require "/usr/local/backup/conf.pl";
use CGI::Carp qw(fatalsToBrowser);
## CWD directory, in other words, when the script logs into the FTP server, ## where would you like the backup.tar.gz file to be placed
$basepath = "/var/lib/mysql"; $ime = "arhiv_mysql"; $cwdd = "mysql"; $subj = "MySQL";
##############################NO MORE EDITING REQUIRED ####################################
use Net::FTP;
$hitch = (); ($day, $month, $year) = (localtime)[3,4,5]; $year = $year + 1900; $month++; $month = sprintf("%02d" ,$month) if $month <= 9; $day = sprintf("%02d" ,$day) if $day <= 9;
if ($date_yes) { $hitch = "$day-$month-$year"; }
$filename = $ime . "_" . $hitch . ".tar" . ".gz"; print "\n\n ARHIVIRANE NA FAILOVETE \n\n"; @the = `tar -czf $tarpath/$filename $basepath`; @mat = stat("$tarpath/$filename");
if ($mat[7] <= 0) { print "Arhiviraneto e prekusnato !!! Vuzmojna greshka w sistemata - @the\n"; &send("Arhiviraneto NEUSPESHNO !!!", "Arhiviraneto NEUSPESHNO !!!"); exit; }
print "Failovete sa kompresirani v $filename\nRazmera na faila e ...................... $mat[7] Bytes\n";
if ($just_back_up) {
&send("Arhiviraneto zawurshi uspeshno. Razmera na arhivirania fail e: $mat[7] bytes", "Arhiviraneto e uspeshno.");
print "Arhivirane bez ftp transfer ..........................OK\n\n";
exit; }
print "Vruzka kum ftp server-a .......................OK\n";
if ($ftp = Net::FTP->new("$ftpserver", Debug => 0)) { print "Autorizazia kum ftp servera .......................OK\n"; } else { print "ne namiram posochenia ftp server !!!\n"; &send("Arhiviraneto NEUSPESHNO !!!. Ne e osushtestena wruzka s ftp server: $ftpserver", "Arhiviraneto NEUSPESHNO"); exit; }
if ($ftp->login("$ftpusername","$ftppass")) { print "Username and Password .......................OK\n"; } else { print "could not log into server with Username and Password. Exiting!\n"; &send("Backup FAILED. Could NOT connect to $ftpserver with the Username And Password provided - Authentication error.", "Backup FAILED"); exit; }
$ftp->binary();
if ($ftp->cwd("$cwdd")) { print "Vlizam w poddirektoria (/$cwdd)...............OK\nKopiram faila $filename na ftp servera . . . . . . . .\n"; } else { print "Ne e izbrana direktoria kudeto da se kopira faila na FTP servera,/n vupreki towa faila shte bude kopiran w glavnata direktoria na servera\n"; }
if ($ftp->put("$tarpath/$filename")) { print "Transferirane na $filename ......................OK\n"; } else { print "FAILA NE E KACHEN NA FTP SERVERA $!\n KRAI\n"; &send("ARHIVIRANETO NEUSPESHNO. FAILA NE E KACHEN NA FTP SERVERA: $ftpserver. $1", "ARHIVIRANETO NEUSPESHNO"); exit; }
$ftp->quit;
if ($delete_source) {
print "Faila ($filename) koito arhivirahme shte bude iztrit ot diska, sled kato veche e kachen na FTP server-a! Iztriwam $tarpath/$filename........";
unlink("$tarpath/$filename") or print "NE MOGA DA IZTRIA FAILA! $!";
print "\nFaila e iztrit ................................OK!\n";
}
print "Arhiviraneto e uspeshno ................. OK!\n>>> Lek den\n\n";
if ($notify) {
#&send("Arhiviraneto e uspeshno!!!. Transferirani sa $mat[7] bytes kym bakcup server-a : $ftpserver", "$subj-Arhiviraneto uspeshno");
}
sub send {
if ($notify) {
open MAIL, "|$sendmail -t" or print "Ne moga da otworia Sendmail $!\n";
print MAIL "To: $to\nFrom: $from\nSubject: $_[1]\n\n$_[0]\n\n.\n";
close MAIL;
}
} |
По този скрипт имаш работа само по четирите реда горе, за да зададеш коя папка ще се архивира и имена на файловете.
Третият (последен) скрипт го кръсти както искаш. Аз за примера ще го кръстя arhivirane
Цитат |
#!/bin/bash
perl /usr/local/backup/arh_mysql.pl |
Този скрипт ще изпълнява архивирането. Тъй като искаш да се изпълнява на всеки час, то трябва да добавиш в crontab-а следния ред:
45 * * * * /usr/local/backup/arhivirane
По този начин на всеки час (1:45, 2:45, 3:45 и т.н.), скриптът ще се изпълнява и ще архивира.
Заради дадените кодове, поста ми стана доста дълъг и обясненията ми са що годе постни, така че ако имаш някакъв проблем или нещо не ти е ясно - кажи и ще ти обясня по-добре
'>
edit: Тези скриптове ще правят архиви, които ще се трупат с времето (т.е. първото денонощие ще станат 24, след второто вече ще имаш 48 файла и т.н.), така че е хубаво да сложиш едно скриптче и за чистене на старите архиви. Ето един пример
Цитат |
#!/usr/bin/perl $dir = "/папката/с/архивите"; $days = "2"; opendir (DIR, "$dir/"); @FILES = grep(//,readdir(DIR)); closedir (DIR); foreach $FILES (@FILES) { if (-M "$dir/$FILES" > $days) { unlink("$dir/$FILES"); } } |
Сложи го и него в /usr/local/backup (сложи го и на отдалечения сървър, където пращаш копие от архивите), направи го изпълним, кръсти го backup_cleaner и добави този ред в crontab-a
45 1 * * * /usr/local/backup/backup_cleaner
По този начин, всеки ден в 1:45, ще се изтриват всички архиви, които са по-стари от 2 дена.