设为首页 收藏本站
查看: 973|回复: 0

[经验分享] perl多线程rsync备份文件到远端主机

[复制链接]

尚未签到

发表于 2018-8-30 10:59:42 | 显示全部楼层 |阅读模式
#!/usr/bin/env perl  

  
use strict;
  
use threads;
  
use Thread::Queue;
  
use File::Find;
  
use File::Rsync;
  
use POSIX qw(strftime);
  

  
#本地主机文件目录
  
my $srcFilePath='/root/test/';
  
#使用队列,将要备份的文件逐一插入队列
  
my $fileQueue = Thread::Queue->new();
  
#远端主机备份目录
  
my $remotedir='lansgg@192.168.137.129::lansggtest';
  
#最大线程数
  
my $thread_max = 5;
  
my $backupTime = strftime("%Y%m%d%H%M%S",localtime(time));
  
print "begin : $backupTime\n";
  

  
#检索要备份目录下的所有文件,. 除外。 linux中 . 代表当前目录
  
sub findAllFile {
  
        unless ( $_ eq '.'){
  
        print "corrent file : $File::Find::name \n";
  
        $fileQueue->enqueue($_);
  
        }
  
}
  

  
find(\&findAllFile,$srcFilePath);
  

  
#使用rsync进行传输
  
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;
  

  
}
  
#检查队列中未传输的文件
  
while ($fileQueue->pending()){
  
    if (scalar(threads->list()) < $thread_max ){
  
         my $readQueue = $fileQueue->dequeue();
  
#        print "current file Queue is $readQueue \n";
  
#生成线程
  
        threads->create(\&rsync,$readQueue);
  

  
#查看当前线程总数
  
        my $thread_count = threads->list();
  
#        print "thread_count is $thread_count\n";
  
    }
  
#确定当前线程是否作业完成,进行回收
  
    foreach my $thread (threads->list(threads::all)){
  
        if ($thread->is_joinable()){
  
                $thread->join();
  
            }
  
        }
  
}
  

  
#join掉剩下的线程(因为在while中的队列为空时,可能还有线程在执行,但是此时程序将退出while循环,所以这里需要额外程序join掉剩下的线程)
  

  
foreach my $thread ( threads->list(threads::all) ) {
  
    $thread->join();
  
    }
  

  

  
$backupTime = strftime("%Y%m%d%H%M%S",localtime(time));
  
print "end : $backupTime\n";



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-558847-1-1.html 上篇帖子: perl统计http日志ip 下篇帖子: sendEmail报错:at /usr/share/perl5/vendor_perl/IO/Socket/SSL.pm
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表