gitlab多线程备份脚本
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,将公司的gitlab服务器进行备份,并且将备份rsync到异地机房,因为备份文件太大,所以这里做了切割成多个文件,进行多线程传输。#!/usr/bin/env perl ############
千家信息网最后更新 2025年12月03日gitlab多线程备份脚本
将公司的gitlab服务器进行备份,并且将备份rsync到异地机房,因为备份文件太大,所以这里做了切割成多个文件,进行多线程传输。
#!/usr/bin/env perl ################ #filename: gitback.pl #version : 1.0 #author : zzq #date : 20160705 #function: The transmission of gitlab backup files to the remote host ######################### use strict; use threads; use Thread::Queue; use File::Rsync; use threads::shared; use File::Find; use File::Basename; use POSIX qw(strftime); use Log::Log4perl qw(:easy); use Mail::Sender; my ($logger,$Msg,$Subject,$filename,$srcFile,$fileName,$filePath,$fileSize,$backFilename); my $fileCount; my $filemsg; my $message; ######### remote host rsync config ################## my $remotehost = 'rsync@10.xx.xx.xx::gitbackup'; ############# back file dir############## my $backFiledir = '/data/gitbackups/'; ######## max threads count############## my $thread_max = 10; ########## current time ############# my $currentTime = strftime("%Y%m%d%H%M", localtime(time)); $Msg = "$currentTime\n"; ########## log file ############## my $logFile = "gitback.log"; my $splitFileQueue = Thread::Queue->new(); my $remotefileQueue = Thread::Queue->new(); ############## define smtp ###################### #Sender my $send_user='monitor@.cc.cn'; #passwd for Sender #my $send_user_pw='123'; #smtp address my $smtp_server='10.168.xx.xx'; #define mail subject $Subject = "gitback-$currentTime"; #address my @address=qw(xxx.cn); ################################################# ################### define log conf ######################### my $log_logger = get_logger(); $log_logger->level($INFO); my $file_appender = Log::Log4perl::Appender->new( "Log::Dispatch::File", filename => "$logFile", mode => "append", ); $log_logger->add_appender($file_appender); my $layout = Log::Log4perl::Layout::PatternLayout->new( "%d %p > %F{1} %M -- %m%n" ); $file_appender->layout($layout); ################################################### main(); sub main { Usage() unless ( scalar(@ARGV) == 0); $log_logger->info("Begin:$currentTime"); $srcFile = backup(); print "srcFile is $srcFile\n"; ($fileName,$filePath) = fileparse($srcFile) if (-f $srcFile); $fileSize=(stat $srcFile)[7]; srcFileMd5($srcFile); splitFile($srcFile); find(\&findSplitFile,$filePath); $fileCount = $splitFileQueue->pending(); $Msg = "$Msg"."FileCount: $fileCount\n"."$filemsg"; splitFileMd5Thread(); rsyncThread(); for my $addr (@address){ sendMail($addr); } $currentTime=strftime("%Y%m%d%H%M", localtime(time)); $log_logger->info("End:$currentTime"); } ###################Access to the backup name for gitlab ################ sub backup { my $result=`gitlab-rake gitlab:backup:create`; my $flag=`echo $?`; if ($flag == 0){ $log_logger->info("gitlab-backup-create : success "); my @result=split(/\n/,$result); for my $cc (@result){ if ($cc =~ /(?\d+_gitlab_backup.tar)/){ $backFilename=$+{'filename'}; $log_logger->info("gitlab-backup-filename : $backFilename"); } } }else{ $log_logger->info("gitlab-backup-create : fail "); } return "$backFiledir$backFilename"; } ############# Search the file after segmentation ################ sub findSplitFile { if ( $_ =~ /$fileName\.\d{3}$/) { $log_logger->info("splitFileQueue enqueue : $_"); $filemsg = "$filemsg"."$_\n"; $splitFileQueue->enqueue($_); $log_logger->info("remotefileQueue enqueue : $_"); $remotefileQueue->enqueue($_); # $log_logger->info("print to logfile : $_"); } } ############## Search the MD5 file after segmentation ############ sub splitFileMd5Thread { while($splitFileQueue->pending()) { my $Queue = $splitFileQueue->dequeue(); $log_logger->info("splitfileQueueMD5 dequeue : $Queue "); threads->create(\&splitFileMd5,$Queue); } foreach my $thread (threads->list(threads::all)){ if ($thread->is_joinable()){ $thread->join(); } } foreach my $thread ( threads->list(threads::all) ) { $thread->join(); } } ################## Search for the source file md5 ################# sub srcFileMd5 { my $file=shift; my $md5_command=`md5sum $file`; my $flag=`echo $?`; if ($flag == 0) { my ($file_md5,$filename) = split(/\s+/,$md5_command); my $log = "srcfile:$file filesize:$fileSize file_md5sum:$file_md5"; $Msg = "$Msg"."srcfile:$file filesize:$fileSize file_md5sum:$file_md5\n"; $log_logger->info($log); }else { my $file_md5 = "system command maybe exec fail, command result code is $md5_command"; my $log = "srcfile:$file filesize:$fileSize file_md5sum:$file_md5"; $Msg = "$Msg"."srcfile:$file filesize:$fileSize file_md5sum:$file_md5\n"; $log_logger->warn($log); } } ####### split File MD5 ############### sub splitFileMd5 { my $file=shift; my $md5_command=`md5sum $filePath$file`; my $flag=`echo $?`; if ($flag == 0) { my ($file_md5,$filename) = split(/\s+/,$md5_command); my $log = "file:$file file_md5sum:$file_md5"; $log_logger->info($log); } } ################# Will be cut by the source file ################ sub splitFile { my $srcFile = shift; my $split_command =`split -b 50M $srcFile -d -a 3 $srcFile.`; $split_command = `echo $? `; if ($split_command == 0 ){ my $splitFileCode = 'success'; $log_logger->info(" srcFile:$srcFile desc:$splitFileCode splitFileResult:$split_command"); }else{ my $splitFileCode = 'fail'; $log_logger->warn(" srcFile:$srcFile desc:$splitFileCode splitFileResult:$split_command"); } } sub rsyncThread { while ( $remotefileQueue->pending() ){ if (scalar threads->list() < $thread_max) { my $readQueue = $remotefileQueue->dequeue(); $log_logger->info("remotefileQueue dequeue : $readQueue "); threads->create(\&rsync,$readQueue); } foreach my $thread (threads->list(threads::all)){ if ($thread->is_joinable()){ $thread->join(); } } } foreach my $thread ( threads->list(threads::all) ) { $thread->join(); } } sub rsync { my $file = shift; my $obj = File::Rsync->new( { archive => 1, compress => 1, checksum => 1, recursive => 1, owner => 1, devices => 1, group => 1, perms => 1, times => 1, verbose => 1, progress => 1, stats => 1, links => 1, 'hard-links' => 1, 'ignore-times' => 1, 'password-file' => './rsync.pass', } ); $obj->exec( { src => "$filePath$file", dest => $remotehost } ); #or warn ($log_logger->warn("rsync: $file to $remotehost fail!" )); my $rval = $obj->realstatus; if ($rval == 0 ) { $log_logger->info("rsync: $file to $remotehost Success!\n"); }else{ my $rsyncError = sprintf ("%s", $obj->err); $message = "$message"."Transfer Failed:\nfile:$file reason:$rsyncError"; $log_logger->info("rsync: $file to $remotehost fail reason:$rsyncError"); } } sub sendMail { my $CONTACTEMAIL = shift; my $sender = new Mail::Sender{ ctype => 'text/plain; charset=utf-8', encoding => 'utf-8', } ; die "Error in mailing : $Mail::Sender::Error\n" unless ref $sender; if ($sender->MailMsg({ smtp => $smtp_server, from => $send_user, to => $CONTACTEMAIL, subject => $Subject, msg => $Msg, # file => "$file", # auth => 'LOGIN', # authid => $send_user, # authpwd => $send_user_pw, charset=>'utf-8' }) < 0) { die $log_logger->error("senermail fail -- $Mail::Sender::Error\n"); } $sender->Close(); } sub Usage { print <<"END"; perl gitback.pl END exit 2; }
备份
文件
线程
公司
多个
异地
服务器
机房
传输
服务
脚本
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
破坏数据库
U8当前数据库无可用资源
第五章数据库技术基础尔雅
小学生网络安全小常识口诀
网络安全课进课堂
保险er数据库模型
数字乡村基础数据库
根服务器在美国网络不安全
易语言数据库更改
京东软件开发实习生天天上班吗
软件开发系统设计规则
分发服务器与应用服务器
数据库读取分离
人工智能和网络安全哪个难
服务器tcp会话时间
中兴g5300服务器售后
软件开发计划.xls
珠海游戏直播软件开发
华为云服务器建在什么地方
网络安全 股票一览
汽车电子软件开发用什么软件
网络安全关键词有哪些
大足县软件开发培训
网络技术与应用书本
如何防范网络安全宣传
魔兽怀旧服国服服务器推荐
高校网络安全具体事例
开启洞穴启动不了服务器
备份视频软件开发
在南京软件开发月薪2万难吗