perl下网站批量更新文件的应用
创始人
2024-02-14 01:00:15
0次

在发布网站的时候,由于要更新的文件比较多,有时候漏传,或者传错了文件,这样后果是很严重的,直接引起网站的异常,所以写了一个自动同步测试服务器的程序,以批量完成文件的更新。

环境,一台测试服务器,一台网站服务器
需求,将测试服务器更新的文件拉取到网站服务器上,网站对应的目录结构都相同。
思路,用perl实现ftp的下载机制,自动将更新文件村放到相应目录,将更新的旧文件按照当前日志进行备份,同时显示更新文件的进度(百分比)。

执行结果如下:

[root@drbd-2 crontab]# ./test.pl
 60% [==========================================                                  ]
3 files is download ok!
2 files is lost...........
this files have losted :
/var/ftp/pub/aa
/var/ftp/pub/bb


代码如下:


#!/usr/bin/perl -w

use strict;

use Net::FTP;
use File::Copy;
use Date::Manip;
use File::Basename;
use Term::ProgressBar;

my $server      = '192.168.1.100';
my $port        = '21';
my $user        = 'upload';
my $pw          = '123456';
my $file        = '/usr/local/crontab/upload';
my $backup_path = '/var/ftp/backup';

open FILE, "< $file"
  or die "can't open $file..... ($!)";

my @failed_files = ();

sub ftp() {
    my $ftp =
      Net::FTP->new( $server, Port => $port, Debug => 0, Timeout => 600 )
      or die "Cannot connect.\n";
    $ftp->login( $user, $pw )
      or die "Could not login.\n";

    my $get = 0;

    open F2, "< $file" or die $!;
    my $number = grep { !/^\s*$/ } ;
    close F2;

    my $progress = Term::ProgressBar->new( { count => $number } );

    $ftp->binary;

    foreach () {

        $_ =~ tr/\t //d;
        if ( $_ =~ /^\s*$/ ) {
            next;
        }

        chomp;

        my $server_path = dirname($_);
        my $server_file = basename($_);

        my $temp_path = substr( $server_path, index( $server_path, "pub" ) );


        my $local_path = $server_path;
        if ( -e $local_path ) {

        }
        else {
            $ENV{"umask"} = "022";
            system("mkdir -p $server_path");
        }

        my $local_file = $server_path . "/$server_file";
        if ( -e $local_file ) {


            my $now_time = localtime();
            my $today_dir = UnixDate( "$now_time", "%Y-%m-%d_%H:%M" );
            system("mkdir -p $backup_path/$today_dir/$temp_path");
            move( "$local_file", $backup_path . "/$today_dir/$temp_path" )
              or die "mv file failed: $!";
        }

        $ftp->cwd($server_path)
          or die "Cannot change working directory. $ftp->message\n";
        if ( $ftp->get( $server_file, $local_file ) ) {
            $progress->update( ++$get );
        }
        else {
            push( @failed_files, $local_file );
        }
    }

    print "$get files is download ok!" . "\n";
    my $lost = $number - $get;
    print "$lost files is lost..........." . "\n";
}

&ftp();

for (@failed_files) {
    print;
    print "\n";

}

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...