一次自動化任務的總結

前段時間一直在做這個定時傳輸大量PDF文件(上萬份)的工作, 具體的工作流程不是很複雜. 首先在根據一些條件從Oracle數據庫中query出objectID, 再根據objectID從mongoDB的數據庫中取出PDF文件, 然後進行打包壓縮, 最後再通過sftp協議把文件發出去. 說來簡單, 但實際編寫過程中還是有一些難點的,首先要從oracle 數據庫中query出mongoDB 的ID, 由於oracle數據庫表衆多, 關係複雜, 篩選規則也頗爲麻煩, 這一步還是花費了不少時間. 其次是公司爲了數據的安全, mongoDB數據庫只能通過linux 服務器上的內網訪問, 這就是有很大一部分編程工作我是無法藉助ide工具的, 只能使用vim, 既沒有自動補全也沒有語法檢測, 寫起來還是挺麻煩的. 第三是自動化任務的權限問題, 運行這個程序的是一個普通的賬號, 而在Linux中, 普通賬號要運行自動化程序要修改多個地方的權限, 不知道此時的我還是走了不少彎路. 至於異常情況處理那些,主要與公司業務有關, 就不多討論了. 閒話不多說了, 開始正文.

安裝Oracle客戶端

本次項目我採用的是python, python要連接Oracle數據庫,首先要在服務器上安裝Oracle客戶端,安裝方法有幾種,這裏介紹最簡單的.大致分爲下面兩個步驟.

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章