前段时间一直在做这个定时传输大量PDF文件(上万份)的工作, 具体的工作流程不是很复杂. 首先在根据一些条件从Oracle数据库中query出objectID, 再根据objectID从mongoDB的数据库中取出PDF文件, 然后进行打包压缩, 最后再通过sftp协议把文件发出去. 说来简单, 但实际编写过程中还是有一些难点的,首先要从oracle 数据库中query出mongoDB 的ID, 由于oracle数据库表众多, 关系复杂, 筛选规则也颇为麻烦, 这一步还是花费了不少时间. 其次是公司为了数据的安全, mongoDB数据库只能通过linux 服务器上的内网访问, 这就是有很大一部分编程工作我是无法借助ide工具的, 只能使用vim, 既没有自动补全也没有语法检测, 写起来还是挺麻烦的. 第三是自动化任务的权限问题, 运行这个程序的是一个普通的账号, 而在Linux中, 普通账号要运行自动化程序要修改多个地方的权限, 不知道此时的我还是走了不少弯路. 至于异常情况处理那些,主要与公司业务有关, 就不多讨论了. 闲话不多说了, 开始正文.
安装Oracle客户端
本次项目我采用的是python, python要连接Oracle数据库,首先要在服务器上安装Oracle客户端,安装方法有几种,这里介绍最简单的.大致分为下面两个步骤.
- 首先是到oracle的官网([http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html?ssSourceSiteId=otncn)]下载对应的客户端和依赖, 现在最新的版本是12.2.0.1.0. 要下载的是 oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm 和oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm,或者其他更老的版本.
- 然后是安装, 如果是centOS系统的话, 安装起来很方便,用下面的命令直接安装就行了.
rpm install *.rpm
如果提示缺少依赖包, 那就先用yum安装缺少的依赖包再安装即可
Ubuntu系统的话首先要安装一个包安装工具,直接用rpm会出错, 先安装alien
sudo apt install alien
然后用
alien --version
查看安装成功与否.如果安装成功, 再用下面的命令安装Oracle客户端就可以了.
sudo apt-get install libaio1
alien -i *.rpm
没有报错就是安装成功了. 接下来还要把客户端所在的文件加入环境变量
export LD_LIBRARY_PATH=/usr/lib/oracle/12.2/client64/lib:$LD_LIBRARY_PATH
注意如果安装的11.2版本的, 对应的位置要换一下. 还有就是上面用命令行加环境变量的方法只在当前terminal生效,如果要永久保存环境变量, 可以修改一下环境变量的配置文件.Ubuntu下的话可以修改 .bashrc 文件来添加.
python连接Oracle
安装完客户端后, 接下来就是通过python连接Oracle并进行.首先安装数据库包, 在这次项目中我使用的是cx_Oracle这个包, API简洁易懂的, 用起来也很顺手.
首先安装cx_Oracle这个包, 直接用pip安装就可以了.我这里用的是python3.
pip3 install cx_Oracle
然后
import cx_Oracle
# 连接数据库
db = cx_Oracle.connect(username, password, IP)
# 执行语句
cursor = db.cursor()
data = cursor.execute(
"SELECT BAR_CODE FROM PLATFORM WHERE PARENTNODENO='' OR NODENO=''")
# 关闭连接
db.close()
上面是最基础的使用, 要详细的用法可以参考官方文档.
linux设置自动化任务
自动化任务还是有一些值得一提, 随手一百度你就会发现crontab这个Linux的工具就是用来构建自动化任务的, 并且用法也并不难.
编辑自动化任务
crontab -e
查看自动化任务列表
crontab -l
删除自动化任务, 若不指定则删除当前用户的所有任务
crontab -r
自动化任务的格式也不复杂.如下所示
分 时 日 月 星期 要运行的命令
第1列分钟0~59
第2列小时0~23(0表示子夜)
第3列日1~31
第4列月1~12
第5列星期0~7(0和7表示星期天)
第6列要运行的命令
举几个例子就好懂了
# 每分钟执行一次
* * * * * myCommand
# 每天晚上10点执行
0 22 * * * myCommand
# 每周六晚上11点重启smb服务
0 23 * * 6 /etc/init.d/smb restart
# 每月1、10、22日的4 : 45重启smb
45 4 1,10,22 * * /etc/init.d/smb restart
大致是这样, 自己体会一下很好懂. 接下来说点实用的. 怎么判断这条命令执行了没有呢? 实际上crontab 的自动化任务是会有log文档, 我们在对应的时间点查看这个文档有没有这条记录就行了.
tail /var/log/cron
万一没有生效呢, 我们怎么知道哪里错误, 可以这样, 用重定向命令
45 4 1,10,22 * * /etc/init.d/smb restart &> msg.txt
这样万一发生错误我们就可以查看msg.txt文件来查看是哪里出了问题.
还有就是权限问题, 如果你有管理员权限那就不用考虑, 当你没有使用的账户并没有管理员权限的时候, 需要修改一下cron程序的权限, 不然是不会执行的.
which cron
# 一般是这个目录/usr/sbin/cron
ll /usr/sbin/cron
# 结果大概是这样-rwxr-xr-x 1 root root 44472 4月 6 2016 cron*
# 如果最后一位没有x权限, 那就要改一下
# 还有一个地方的权限要改
which crontab
#/usr/bin/crontab
ll /usr/bin/crontab
#-rwxr-sr-x 1 root crontab 36080 4月 6 2016 /usr/bin/crontab*
# 注意看上面的中间部分, 有一个字母为s, 我们知道文件的权限一般为r, w, x. 这个s是什么鬼, 其实是Set GID,简称为SGID