Linux轮询目录FTP传输文件

  之前在公司,在linux服务器上需要写一个shell脚本,功能如下:定时任务5秒钟执行一次,轮询当前机器(127.0.0.1)A目录,并把A目录下所有QRYTYP*开头的文件传输到另外一台机器(10.32.64.128)的B目录下,文件名也为QRYTYP*。

  这样就要考虑几个问题:现在有一个文件QRYTYP123456需要传输,

  1.QRYTYP123456达到A目录下,但文件过大,还在传输。而刚好被定时任务轮询到,这样B目录下的目标文件就会不完整。

  2.假设QRYTYP123456已经传输完成,有一个定时任务轮询到文件,并且在FTP传输过程中,刚好又被第二个定时任务轮询到这个文件,导致一个文件并两个定时任务进行传输,不是我们希望看到的结果。

  3.多任务传输大文件过程中,怎么保证FTP传输是成功的?

  整个解决思路如下:

  1.使用lsof指令查看文件是否被其他进程占用

  2.如果文件没被占用,表示已传输完成,则把文件QRYTYP123456改成QRYTYPE123456.tmp,FTP传输的是QRYTYP123456.tmp文件到目标机器B的临时目录(TMP),传输完成后使用rename指令对文件进行重名并移到目标目录。

  3.为了多个任务传输同一个文件,把每个定时任务轮询到的所有QRYTYP*文件名写到file.lst.${PID_NUMBER}文件中,PID_NUMBER = [进程号][当前时间],这样保证每个任务都处理轮询到的文件,不会造成并发传输。

  4.根据ftp的传输日志,可以根据日志“226 Transfer complete”(具体日志还需根据linux的版本来定),不过一般都是已"226"开头的,所以日志里出现"226 ......",就表示该文件传输完成了。

  说了那么多,上代码最实际:

  整个模块的脚本都放在tools目录下,分别是:dgyc_crontab_second_5.sh,dgyc_main_for_cronb_second_5.sh,file_ftp2dgyc_for_crontab_second_5.sh,有几点要注意的:

  1.dgyc_crontab_second_5.sh 这个文件的执行可通过crontab -e,添加一行:* * * * * dgyc_crontab_second_5.sh,保存退出即可。

  这里是每5秒轮询一次,可以修改INTERVAL_SECOND,缩短轮询时间,最好是能被60整除,这样会比较精确。

  2.dgyc_main_for_cronb_second_5.sh:LOC_SND_DIR=/si/usr/dgyc/fsend 就是你要轮询的目录,LOC_SND_TMP=/si/usr/dgyc/tmp是用来放日志的。

  设置过滤规则FILE_NAME_FILTER_REGULATION="QRYTYP*",如果ls QRYTYP*这种通配符形式满足不了你的过滤需求,你可以通过管道"|",再使用 awk 或者 grep 的正则表达式来过滤也是可以的。

  RMT_SND_DIR,RMT_TMP_DIR都是目标机器的目录,一般都是采用"/",因为目标机器的FTP都是根据目录来开的。

  3.file_ftp2dgyc_for_crontab_second_5.sh:要修改目标机器的地址,用户名,密码。

  特别提醒:

  1.复制下面的代码到文本编辑器,换行符默认是"CRLF"的,但是linux是"LF"结尾,需要改过来的。

  2.执行文件的过程中,看看*.sh有没有"x"权限,新手常常会犯这种错误啊!!!

#!/bin/ksh

#if the script startuped by crontab,
#it will ececute dgyc_main_for_cronb_second_5.sh per 5 seconeds.
BASE_HOME=/tools
INTERVAL_SECOND=5
let interval_count=60/INTERVAL_SECOND
script_file=$BASE_HOME/dgyc_main_for_cronb_second_5.sh
for((i=1;i<=${interval_count};i++));do
  ${script_file} 2>/dev/null &
  sleep ${INTERVAL_SECOND}
done
#!/bin/ksh

#
#    file directory
#
SCRIPT_DIR=/tools

#update1
LOC_SND_DIR=/si/usr/dgyc/fsend
LOC_TMP_DIR=/si/usr/dgyc/tmp
RMT_SND_DIR=/
RMT_TMP_DIR=/
CURRENT_DATE_TIME=$(date "+%Y%m%d%H%M%S")
PID_NUMBER=$$$CURRENT_DATE_TIME
TMP_FILE_SUFFIX=".tmp"

#----------------------------------------------------------------
#
#    send the txn file
#
#----------------------------------------------------------------

#
#    get the txn file list
#
cd $LOC_SND_DIR

rm -f $LOC_TMP_DIR/file.lst.$PID_NUMBER > /dev/null 2>&1

ls -1 -F QRYTYP* | grep -v [/$] | grep -v ["$TMP_FILE_SUFFIX"$] | while read LINE
    do
        /usr/sbin/lsof |grep $LINE |grep -v lsof|grep -v grep > /dev/null 2>&1
        if [ "$?" = "1" ]
        then
            mv $LINE $LINE$TMP_FILE_SUFFIX
            echo $LINE >> $LOC_TMP_DIR/file.lst.$PID_NUMBER
            #crontab task will send a file only.
            break
        fi
    done
if [ ! -f "$LOC_TMP_DIR/file.lst.$PID_NUMBER" ]
then
    exit 1
fi
FILE_SIZE=`ls -l $LOC_TMP_DIR/file.lst.$PID_NUMBER | awk ‘{ print $5 }‘`
if [ $FILE_SIZE -eq 0 ]
then
    rm -f $LOC_TMP_DIR/file.lst.$PID_NUMBER > /dev/null 2>&1
fi

#
#    get the file name and put
#
if [ "$FILE_SIZE" != "0" ]
then
    cat $LOC_TMP_DIR/file.lst.$PID_NUMBER | while read LINE
    do
        #update3
        /usr/sbin/lsof |grep $LINE$TMP_FILE_SUFFIX |grep -v lsof|grep -v grep > /dev/null 2>&1
        if [ "$?" = "1" ]
        then
            $SCRIPT_DIR/file_ftp2dgyc_for_crontab_second_5.sh $LOC_SND_DIR $LOC_TMP_DIR $LINE $RMT_SND_DIR $RMT_TMP_DIR $PID_NUMBER $TMP_FILE_SUFFIX
        fi
    done
fi
if [ -f "$LOC_TMP_DIR/file.lst.$PID_NUMBER" ]
then
    rm $LOC_TMP_DIR/file.lst.$PID_NUMBER
fi
#****************************************************************
#
#        End of file
#
#****************************************************************
#!/bin/ksh

#
#    ftp constant variable
#
FTP_ADDR="10.32.64.128"
FTP_USER=dgyc
FTP_PWD=dgyc1113

#
#    input variable
#
LOC_SND_DIR=$1
LOC_TMP_DIR=$2
FILE_NAME=$3
RMT_SND_DIR=$4
RMT_TMP_DIR=$5
PID_NUMBER=$6
TMP_FILE_SUFFIX=$7
FTP_SUCCESS_MSG="^226 "
FTP_INFORMATION_LOG=$LOC_TMP_DIR/"ftp_information_"$PID_NUMBER".log"
#
#    check the file
#
cd $LOC_SND_DIR

ls -l $FILE_NAME$TMP_FILE_SUFFIX >/dev/null 2>&1
if [ "$?" = "1" ]
then
    exit 1
fi

#
#    copy the orignial file to a new file
#    with ".tmp" in the name.
#
TMP_FILE_NAME=$FILE_NAME$TMP_FILE_SUFFIX

#
#    put the file
#
ftp -inv $FTP_ADDR <<! >> $FTP_INFORMATION_LOG
user $FTP_USER $FTP_PWD
bin
cd $RMT_TMP_DIR
put $TMP_FILE_NAME
ls -l
rename $RMT_TMP_DIR/$TMP_FILE_NAME $RMT_SND_DIR/$FILE_NAME
close
quit
!
if grep "$FTP_SUCCESS_MSG" $FTP_INFORMATION_LOG ;then
    #if ftp transfer success,it will remove temp file
    rm $TMP_FILE_NAME
else
    #if ftp transfer failure,it will rename temp file to file
    mv $TMP_FILE_NAME $FILE_NAME
fi

if [ -f $FTP_INFORMATION_LOG ]
then
    rm -rf $FTP_INFORMATION_LOG
fi
#****************************************************************
#
#        End of file
#
#****************************************************************
时间: 2024-11-18 08:23:31

Linux轮询目录FTP传输文件的相关文章

Linux下使用shell实现上传linux下某个目录下所有文件到ftp

首先我们需要搞清楚单个文件怎么上传,把这个单文件上传到ftp上的实现命名为一个:upload_to_ftp_command.sh 之后,需要弄清楚怎么实现遍历一个目录下的所有文件的,把这个遍历某个目录下的文件实现命名为:foeach_directory_and_uploadfile_to_ftp.sh. upload_to_ftp_command.sh #!/bin/bash FTILE_NAME=$1 ftp -n <<- EOF open 100.170.141.26 user jy ne

Linux 基础入门----目录结构及文件基本操作

Linux 目录结构及文件基本操作 介绍 1.Linux 的文件组织目录结构. 2.相对路径和绝对路径. 3.对文件的移动.复制.重命名.编辑等操作. 一.Linux 目录结构 在讲 Linux 目录结构之前,你首先要清楚一点东西,那就是 Linux 的目录与 Windows 的目录的区别,或许对于一般操作上的感受来说没有多大不同,但从它们的实现机制来说是完全不同的. 一种不同是体现在目录与存储介质(磁盘,内存,DVD 等)的关系上,以往的 Windows 一直是以存储介质为主的,主要以盘符(C

FTP传输文件(hcl模拟器的操作)

使用FTP协议传输文件是非常方便的. 设备作为FTP客户端:用户在设备的命令行终端上执行ftp命令,建立设备与远程FTP服务的连接,下载服务器上的文件或上传本地文件. 设备作为FTP服务器:用户在其他主机上运行FTP客户端程序,登陆到设备上执行文件的上传和下载. 主要配置命令包括以下: 1:首先开启FTP服务:ftp service enable 2:创建用户:local-user hu 3:配置用户类型和密码:password simple 123 service-type ftp

linux ls列出目录下所有文件数量

查看统计当前目录下文件的个数,包括子目录里的. ls -lR| grep "^-" | wc -l[喝小酒的网摘]http://blog.hehehehehe.cn/a/12311.htm Linux下查看某个目录下的文件.或文件夹个数用到3个命令:ls列目录.用grep过虑.再用wc统计.举例说明:1.查看统计当前目录下文件的个数 ls -l | grep "^-" | wc -l 2.查看统计当前目录下文件的个数,包括子目录里的. ls -lR| grep &q

linux中的目录权限及文件权限

linux的权限分为 rwx三种: r: read 读的权限. w: write 写的权限 x: execute 执行的权限 1. 文件的权限 文件的读写权限,没有什么特别的. 那么什么是文件的执行权限呢? 在window下面文件是否可以执行是由后缀名决定的,例如: .exe .com .bat 等等 但是在 linux 中后缀名常常只是一个表示作用,表明何种类型,至于真正是否可以执行,则取决于该文件的 x 权限. 1 [[email protected] bin]# 2 [[email pro

Linux /proc/pid目录下相应文件的信息说明和含义

Proc是一个虚拟文件系统,在Linux系统中它被挂载于/proc目录之上.Proc有多个功能 ,这其中包括用户可以通过它访问内核信息或用于排错,这其中一个非常有 用的功能,也是Linux变得更加特别的功能就是以文本流的形式来访问进程信息.很Linux命令(比如 ps.toPpstree等)都需要使用这个文件系统的信息.注意,本文就是向用户介绍一些访问这些信息的方法 .需要说明的是,本文所述的内容并不 一定适用所有内核版本,有部分操作只适用于2.6内核.一.进程信息在/proc文件系统中,每一个

防火墙导致FTP传输文件为0

在使用 ftpClient 传输文件到FTPserver时,在别的机器上可以正常使用,但是到自己的机器有就始终是0文件,发现是Mcafee 防火墙导致的,只要让防火墙放行即可. Mcafee防火墙的放行方法: 1. 2.

linux从一台服务器传输文件到另一台服务器上

首先两台服务器必须是可以ping通的 例: ping 10.22.137.10 ping通之后: 1.复制文件 格式: scp 目录/文件名.文件格式 目标服务器用户名@ip地址:目标服务器目录 例: scp /backup/test/md3/export.sh [email protected]:/ssx/dev/md12.复制目录(包括目录下的文件) scp -r /backup/test/md3 [email protected]:/ssx/dev/md 原文地址:https://blog

linux下面修改目录下所有文件时间

查看文件的时间:sata test.txt 更新目录下面所有文件的时间:find ./* -type f -exec touch {} \; 更新目录下面所有目录的时间:find ./* -type d -exec touch {} \; 修改一个文件的日期时间:touch -d "2020-11-11 11:00:00" test.txt 原文地址:https://blog.51cto.com/7794482/2444531