需求:
成都創(chuàng)新互聯(lián)長(zhǎng)期為成百上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為東臺(tái)企業(yè)提供專業(yè)的成都做網(wǎng)站、網(wǎng)站設(shè)計(jì),東臺(tái)網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
主機(jī)上有上百G的備份文件要rsync到遠(yuǎn)端主機(jī),我們將大文件進(jìn)行切割為幾十個(gè)小文件進(jìn)行多線程傳輸。
這里使用14個(gè)1G的文件進(jìn)行演示:
[root@vm0 test]# pwd /root/test [root@vm0 test]# ll 總用量 13631540 -rw-r--r--. 1 root root 1073741824 6月 11 18:29 test10.data -rw-r--r--. 1 root root 1073741824 6月 11 18:30 test11.data -rw-r--r--. 1 root root 1073741824 6月 11 18:31 test12.data -rw-r--r--. 1 root root 1073741824 6月 11 18:31 test13.data -rw-r--r--. 1 root root 1073741824 6月 11 18:32 test14.data -rw-r--r--. 1 root root 1073741824 6月 11 18:23 test2.data -rw-r--r--. 1 root root 1073741824 6月 11 18:24 test3.data -rw-r--r--. 1 root root 1073741824 6月 11 18:25 test4.data -rw-r--r--. 1 root root 1073741824 6月 11 18:26 test5.data -rw-r--r--. 1 root root 1073741824 6月 11 18:26 test6.data -rw-r--r--. 1 root root 1073741824 6月 11 18:27 test7.data -rw-r--r--. 1 root root 1073741824 6月 11 18:28 test8.data -rw-r--r--. 1 root root 1073741824 6月 11 18:29 test9.data [root@vm0 test]#
腳本名:tq.pl
#!/usr/bin/env perl use strict; use threads; use Thread::Queue; use File::Find; use File::Rsync; use POSIX qw(strftime); #本地主機(jī)文件目錄 my $srcFilePath='/root/test/'; #使用隊(duì)列,將要備份的文件逐一插入隊(duì)列 my $fileQueue = Thread::Queue->new(); #遠(yuǎn)端主機(jī)備份目錄 my $remotedir='lansgg@192.168.137.129::lansggtest'; #最大線程數(shù) my $thread_max = 5; my $backupTime = strftime("%Y%m%d%H%M%S",localtime(time)); print "begin : $backupTime\n"; #檢索要備份目錄下的所有文件,. 除外。 linux中 . 代表當(dāng)前目錄 sub findAllFile { unless ( $_ eq '.'){ print "corrent file : $File::Find::name \n"; $fileQueue->enqueue($_); } } find(\&findAllFile,$srcFilePath); #使用rsync進(jìn)行傳輸 sub rsync { my $file = shift; print "rsync -- $file \n"; my $obj = File::Rsync->new( { archive => 1, compress => 1, checksum => 1, recursive => 1, times => 1, # verbose => 1, timeout => 300, progress => 1, stats => 1, 'ignore-times' => 1, 'password-file' => './rsync.pass', } ); $obj->exec( { src => "$srcFilePath$file", dest => $remotedir } ) or warn "rsync Failed ! \n"; #print $obj->out; } #檢查隊(duì)列中未傳輸?shù)奈募?while ($fileQueue->pending()){ if (scalar(threads->list()) < $thread_max ){ my $readQueue = $fileQueue->dequeue(); # print "current file Queue is $readQueue \n"; #生成線程 threads->create(\&rsync,$readQueue); #查看當(dāng)前線程總數(shù) my $thread_count = threads->list(); # print "thread_count is $thread_count\n"; } #確定當(dāng)前線程是否作業(yè)完成,進(jìn)行回收 foreach my $thread (threads->list(threads::all)){ if ($thread->is_joinable()){ $thread->join(); } } } #join掉剩下的線程(因?yàn)樵趙hile中的隊(duì)列為空時(shí),可能還有線程在執(zhí)行,但是此時(shí)程序?qū)⑼顺鰓hile循環(huán),所以這里需要額外程序join掉剩下的線程) foreach my $thread ( threads->list(threads::all) ) { $thread->join(); } $backupTime = strftime("%Y%m%d%H%M%S",localtime(time)); print "end : $backupTime\n";
此腳本是使用了核心功能,后期可以加上日志記錄,郵件發(fā)送等功能。
當(dāng)我們執(zhí)行該腳本時(shí),查看主機(jī)線程情況
[root@vm0 pl]# ps -ef |grep tq root 6377 2152 88 19:05 pts/3 00:00:12 perl ./tq.pl [root@vm0 pl]# pstree -p 6377 perl(6377)─┬─rsync(6379) ├─rsync(6381) ├─rsync(6383) ├─rsync(6385) ├─rsync(6387) ├─{perl}(6378) ├─{perl}(6380) ├─{perl}(6382) ├─{perl}(6384) └─{perl}(6386) [root@vm0 pl]# ps -ef |grep rsync root 6379 6377 14 19:05 pts/3 00:00:14 rsync --archive --checksum --compress --ignore-times --progress --recursive --stats --times --password-file=./rsync.pass --timeout=300 /root/test//test13.data lansgg@192.168.137.129::lansggtest root 6381 6377 14 19:05 pts/3 00:00:14 rsync --archive --checksum --compress --ignore-times --progress --recursive --stats --times --password-file=./rsync.pass --timeout=300 /root/test//test12.data lansgg@192.168.137.129::lansggtest root 6383 6377 14 19:05 pts/3 00:00:14 rsync --archive --checksum --compress --ignore-times --progress --recursive --stats --times --password-file=./rsync.pass --timeout=300 /root/test//test1.data lansgg@192.168.137.129::lansggtest root 6385 6377 14 19:05 pts/3 00:00:14 rsync --archive --checksum --compress --ignore-times --progress --recursive --stats --times --password-file=./rsync.pass --timeout=300 /root/test//test8.data lansgg@192.168.137.129::lansggtest root 6387 6377 12 19:05 pts/3 00:00:12 rsync --archive --checksum --compress --ignore-times --progress --recursive --stats --times --password-file=./rsync.pass --timeout=300 /root/test//test3.data lansgg@192.168.137.129::lansggtest root 6399 2193 0 19:06 pts/2 00:00:00 grep rsync