您好,登錄后才能下訂單哦!
需求:
主機(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
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。