1.ftp传输常用命令说明:
ls 列出远程机的当前目录
cd 在远程机上改变工作目录
lcd 在本地机上改变工作目录
ascii 设置文件传输方式为ASCII模式
binary 设置文件传输方式为二进制模式
close 终止当前的ftp会话
hash 每次传输完数据缓冲区中的数据后就显示一个#号
get(mget) 从远程机传送指定文件到本地机
put(mput) 从本地机传送指定文件到远程机
#!/bin/bash
cur_date=`date +'%Y%m%d'`
static_dir="/dir/$cur_date"
local_dir="/dir/"
count=`ls $local_dir | wc -w`
echo $count
i=1
for a in $( ls $local_dir );do #循环遍历指定目录文件,这一步只要是判断有没有需要传输的文件,若没有需要传输的文件,则不进行传输
echo $i
echo "循环开始"
if [ "${a##*.}"x = "sql"x ];then #指定传输后缀为sql的文件
echo "传输文件-->$a"
break; #存在sql文件便退出循环
elif [ $i -eq $count ]; then
echo "sqlFileNotExist"
exit; #若传输文件不存在,则退出脚本
else
let i++
continue;
fi
done
ftp -n -v <<EOF
open ipaddr port #输入地址ipaddr以及端口号port
user ftpuser ftppwd #输入用户名ftpuser以及密码ftppwd
ls #列出远程目录
hash
cd $static_dir #进入远程传输文件所在目录
lcd $local_dir #进入本地传输文件所在目录
prompt
mput *.sql #传输所有后缀为sql的文件
bye #退出ftp
EOF
2.在进行连接远程ftp服务时,总出现中途失去连接的情况,目前原因还没有排查出来,针对这种情况,我在另外的脚本里对执行上一脚本时进行了日志记录,若日志里存在“226 Transfer complete”则证明传输成功,若没有,则证明传输中失去了连接,则尝试重新连接传输。上限设定了50次。
#!/bin/bash
rm -rf upload_odd.log #运行前清空记录日志内容
local_dir="/dir/sh" #本地传输文件所在目录
nohup sh /home/uploadftp.sh >upload_oss.log 2>&1 & #运行传输脚本并进行日志记录
wait; #等待脚本运行结束,再执行以下内容
if [ `grep -c "sqlFileNotExist" upload_oss.log` -eq '1' ];then #判断是否有需要传输的文件,若没有,则退出脚本
echo "没有需要传输生成的sql文件"
exit;
fi
i=0 #定义循环次数
while [ `grep -c "226 Transfer complete" upload_oss.log` -eq '0' ]
do #判断传输是否成功
let i++
echo "循环执行$i次"
nohup sh /home/uploadftp.sh >upload_oss.log 2>&1 & #若没有成功,则继续执行传输脚本文件
wait; #等待传输文件脚本执行完毕
if [ $i -eq 50 ];then #为防止循环次数太多,限定循环上线50次
echo "循环执行超出限定次数"
echo "upload fail" #超出上限,则提示传输失败
exit
fi
done
echo "success!"
for a in $( ls $local_dir );do #将传输成功的sql文件进行重命名
if [ "${a##*.}"x = "sql"x ];then
echo $a
ntime=`date +'%Y-%m-%d %H:%M:%S'`
nseconds=$(date --date="$ntime" +%s);
mv $local_dir$a "$local_dir$a.$nseconds.ok"
fi
done
echo "commit to ftp successfully"
3.输入crontab -e开启crontab进行定时设置
30 09 * * * sh /dir/uploadftp_run.sh #设置每天九点半定时跑脚本
crontab时间格式说明
minute(分)可以设置0-59分
hour(小时)可以设置0-23小时
day of month(日期)可以设置1-31号
month(月份):可以设置1-12月
day of week(星期):可以设置0-7星期几,其中0和7都代表星期天,或者也可以使用名称来表示星期天到星期一,例如sun表示星期天,mon表示星期一等等
crontab范例
每五分钟执行 */5 * * * *
每小时执行 0 * * * *
每天执行 0 0 * * *
每周执行 0 0 * * 0
每月执行 0 0 1 * *
每年执行 0 0 1 1 *
关于shell运算符的简单介绍:
大于 -gt (greater than)
小于 -lt (less than)
大于或等于 -ge (greater than or equal)
小于或等于 -le (less than or equal)
不相等 -ne (not equal)