一次自动化任务的总结

前段时间一直在做这个定时传输大量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

你可能感兴趣的:(一次自动化任务的总结)