【应用】:shell crontab定时生成oracle表的数据到txt文件,并上传到ftp
一、本人环境描述
1、oracle服务端装在win7 32位上,oracle版本为10.2.0.1.0
2、Linux为centos6.5 32位,安装在Oracle VM VirtualBox虚拟机上
3、win7上装有ftp服务
二、功能实现描述
用shell的crontab命令定时执行某个.sh文件,此文件的功能已实现生成oracle表的数据到本地txt文件,并上传到ftp,必要时可记录执行日志。
三、步骤
1、在centos中安装oracle客户端并配置环境变量
3、编写shell,实现查询oracle数据库表,并写到本地txt文件
5、修改shell,打印执行日志
打印日志函数如下:
function loginfo { time_flag=`date +"%Y-%m-%d %H:%M:%S"` echo "[${time_flag}] [INFO] -- $1" }
6、所有shell代码
数据表结构见【编写shell,实现查询oracle数据库表,并写到本地txt文件】
A、把打印日志函数封装成testLog.sh,代码如下:
#!/bin/bash ###################################################################################### #功能:定义日志打印函数 #用法:loginfo “日志内容” #版本:0.1 #作者:crazyMyWay #日期: #说明:建立初版 ###################################################################################### function loginfo { time_flag=`date +"%Y-%m-%d %H:%M:%S"` echo "[${time_flag}] [INFO] -- $1" }
B、通过ftp上传文件代码封装成testFtptool.sh,如下:
#!/bin/bash ###################################################################################### #功能:ftp上传/下载文件 #用法:第一个参数put(上传)还是get(下载)文件,第二个参数为FTP服务器IP,第三、四个参数分别是用户名和密码 # 第五个参数是FTP上的工作目录,第六个是本地的目录,第七个是操作的文件名 #例子:testFtptool.sh put|get ip_address ftp_user ftp_password ftp_dir local_dir filename #版本:0.1 #作者:crazyMyWay #日期: #说明:建立初版 ###################################################################################### E_NOTROOT=67 #输出帮助信息,用法:./testFtptool.sh -h if [ $# -eq 1 -a "$1" = "-h" ] then echo "Usage: $0 put|get ip_address ftp_user ftp_password ftp_dir local_dir filename" echo "Example: $0 put|get ftp服务ip ftp用户名 ftp密码 ftp目录 本地目录 文件名" exit $E_NOTROOT fi #如果参数不等于7 if [ $# != 7 ] then echo "Param error: Usage: $0 put|get ip_address ftp_user ftp_password ftp_dir local_dir filename" exit $E_NOTROOT fi #进行ftp操作,ftp命令解释请查阅相关资料 ftp -v -n <<! open $2 21 user $3 $4 prompt epsv4 off cd $5 bin lcd $6 $1 $7 quit !
C、主要代码testStudent.sh,如下:
#!/bin/bash ###################################################################################### #功能:从oracle中查询数据(t_student),并写到txt文件中,以student_yyyymmdd.txt命名, # 最后上传到ftp #用法:定时调度执行,每天凌晨2点执行(或直接执行) # 注意修改:user/password@service、 # 引入testLog.sh和testFtptool.sh的路径、 # ftp-ip、ftp-username、ftp-password、ftp上传目录、本地目录 # #版本:0.1 #作者:crazyMyWay #日期:2015-03-29 #说明:建立初版 ###################################################################################### #加入用户环境变量,如果不执行这句,那么在用cron命令时, #不会自动加载用户的环境变量,如果用到sqlplus之类命令,因此会出错 . ~/.bash_profile #定义文件后缀名称yyyymmdd filename_postfix=`date +"%Y%m%d"` #定义相关变量 oracle_user="centos" oracle_pass="centos" oracle_id="win7orcl" current_file_dir="/ljxd/shell-demo/oracle/" current_file_name="student_${filename_postfix}.txt" common_file_dir="/ljxd/shell-demo/oracle/" ftp_ip="192.168.56.101" ftp_user="student" ftp_pass="student" ftp_upload_path="/student" #引入log文件 . ${common_file_dir}testLog.sh loginfo "generate data start........" #连接到oracle,设置相关参数,并输出数据到txt文件 sqlplus -s ${oracle_user}/${oracle_pass}@${oracle_id} <<EOF >${current_file_dir}${current_file_name} set pages 0 set feed off set heading off set feedback off set verify off set linesize 1000 select t.id||'###'||t.name||'###'||to_char(t.birthday,'yyyy-mm-dd hh24:mi:ss') from t_student t; EOF #推数据到ftp loginfo "transfer data to ftp......." . ${common_file_dir}testFtptool.sh put ${ftp_ip} ${ftp_user} ${ftp_pass} ${ftp_upload_path} ${current_file_dir} ${current_file_name} #end loginfo "generate data end........."
注意目录结构,修改相关参数,运行./testStudent.sh即可
测试结果如下:
7、crontab命令实现定时任务
crontab -e|-l|-r
-e|-l|-r分别为编辑、查看、删除定时任务,每个用户下会有一个crontab配置文件,详细说明请查阅相关资料。
每天凌晨2点定时调度执行,并把输出日志追加到student.log文件中,crontab命令如下:
保存并退出编辑器,定时器立即生效。