前段時間一直在做這個定時傳輸大量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