В своё время для бэкапа был написан небольшой скрипт на perl, который читает конфиг, получает информацию в какое время что бэкапить и куда слать архивы. При высоком уровне загрузки он бэкапы не делает.
Вот пример его конфига
% backupper config % % i H d M D prefix backupped_path tmp_folder storage_path % 00 22 * * * fast_mysql /var/backup /tmp agava4***:***@host.ru 00 23 * * * etc /etc /tmp agava4***:***@host.ruu 01 23 * * * usr_local_bin /usr/local/bin /tmp agava4***:***@host.ru 10 23 * * * home_0 /home/0* /tmp agava4***:***@host.ru 20 23 * * * home_1 /home/1* /tmp agava4***:***@host.ru 50 23 * * * home_2 /home/2* /tmp agava4***:***@host.ru 55 23 * * * home_3 /home/3* /tmp agava4***:***@host.ru 15 00 * * * home_4 /home/4* /tmp agava4***:***@host.ru 20 00 * * * home_5 /home/5* /tmp agava4***:***@host.ru 25 00 * * * home_6 /home/6* /tmp agava4***:***@host.ru 45 00 * * * home_7 /home/7* /tmp agava4***:***@host.ru 50 00 * * * home_8 /home/8* /tmp agava4***:***@host.ru 00 01 * * * home_9 /home/9* /tmp agava4***:***@host.ru
Синтаксис указания времени почти кроновский, но используются только конкретные числовые значения и звёздочки.
Вот сам скрипт. Для его работы потребуется консольная программа ftp. Скрипт надо повесить на cron ежеминутно.
#!/usr/bin/perl $GZIP_PATH = "/bin/gzip"; $TAR_PATH = "/bin/tar"; $FTP_PATH = "/usr/bin/ftp"; $CONFIG_FILE = "/etc/backuper.conf"; $LOG_FILE = "/var/log/backuper.log"; $RM_PATH = "/bin/rm"; open(A, $CONFIG_FILE); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); READCONFIG: while (<A>) { ($c_minute, $c_hour, $c_day, $c_mon, $c_wday, $backup_prefix, $backuped_path, $tmp_folder, $storage_path) = split /\s+/, $_; next READCONFIG if $c_minute=~/\%/ || !$c_minute; # print $fields[0]."\n"; if( ($c_minute == $min || $c_minute eq "*") && ($c_hour == $hour || $c_hour eq "*") && ($mday == $c_day || $c_day eq "*") ){ backup($backup_prefix, $backuped_path, $tmp_folder, $storage_path, #"-".($year+1900)."-".$mon."-".$mday."_".$hour."_".$min "" ); } } close(A); sub backup{ my ($backup_prefix, $backuped_path, $tmp_folder, $storage_path, $suffix) = @_; open(B, ">>".$LOG_FILE); print B get_date_log()."Start backup $backuped_path(".get_avg().")\n"; if(get_avg()>1){ print B get_date_log()."High load avarage. Stopped.\n"; $command = 'ps -A|grep "[1-9]\.[0-9]"'; $ps = `$command`; print B "\n$ps\n"; close(B); return 0; } $command = "$TAR_PATH -cf $tmp_folder/$backup_prefix$suffix.tar $backuped_path"; `$command`; print B get_date_log()."Creating $tmp_folder/$backup_prefix$suffix.tar completed(".get_avg().")\n"; $command = "$GZIP_PATH -9 $tmp_folder/$backup_prefix$suffix.tar"; `$command`; print B get_date_log()."Creating $tmp_folder/$backup_prefix$suffix.tar.gz completed(".get_avg().")\n"; return 0 if (!$storage_path=~/([a-z0-9\-\.]+):([a-z0-9\-\.]+)\@([a-z0-9\-\.]+)\/([a-z0-9\-\.\_\/]+)/ig); my ($username, $password, $host, @path) = split /[\@\:\/]/,$storage_path;$path = join "/", @path; $command = "/usr/bin/ftp -i -n <<EOF open $host user $username $password dele $path/$backup_prefix$suffix.tar.gz put $tmp_folder/$backup_prefix$suffix.tar.gz $path/$backup_prefix$suffix.tar.gz quit EOF"; `$command`; print B get_date_log()."Uploading $tmp_folder/$backup_prefix$suffix.tar.gz completed(".get_avg().")\n"; `$RM_PATH $tmp_folder/$backup_prefix$suffix.tar.gz`; print B get_date_log()."Removing $tmp_folder/$backup_prefix$suffix.tar.gz completed(".get_avg().")\n"; close(B); } sub get_date_log{ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); return "[".(1900+$year)."-".$mon."-".$mday." ".$hour.":".$min.":".$sec."]"; } sub get_avg(){ $avg=`uptime`; $avg=~s/^.*?average.*?:\s*(.*?)[^\d\.\,]+.*/$1/gi; $avg=~s/\,/\./gi; chomp($avg); return $avg; }