1. 程式人生 > 實用技巧 >Python定時任務,三步實現自動化

Python定時任務,三步實現自動化

大家好,我是小一

今天的文章源自於工作中的一個小技巧,主要是涉及到日常工作的自動化處理。

如果說你每天都需要做一些重複的工作,比如出一份報告、統計一個數據、發一封郵件等等

那你完全可以把這個任務交給電腦讓它每天自動替你完成,而你只需要從容的開啟保溫杯,靜靜地泡一杯枸杞


今天主要會用到Linux下的cron這個服務,ok,直接開始



1. 安裝cron

基本上所有的Linux發行版在預設情況下都預安裝了cron工具。

即使未預裝cron,也很簡單,執行幾條簡單的命令就可手動安裝

# 檢查是否已經預裝了cron
service cron status
複製程式碼

安裝並啟動服務

安裝:apt-get install cron
啟動/停止/重啟:service cron start/stop/restart
查詢當前任務:crontab -l
複製程式碼

2. 安裝檢查

安裝完成後檢查一下是否安裝成功,同樣使用 status命令檢視

出現如下提示表示安裝成功:

另外,在ubuntu下可能會出現這樣的提示:

這個也表示可以正常使用


3. cron用法

有幾個關於cron的簡單用法可以瞭解一下,後面也會通過一個案例詳細介紹如何使用

首先,列出當前使用者計劃的cron作業:

crontab -l
複製程式碼

檢視其它使用者的cron作業:

crontab –l –u username
複製程式碼

移除已經計劃的cron作業:

crontab –r
複製程式碼

4. 排程crontab計劃

首先,通過如下命令新增或更新crontab中的任務

第一次進入會要求你選擇編輯器,這個根據自己的習慣選擇。

選擇好之後會進入到這樣的一個介面:

用過vim的同學應該對這個介面不陌生,類似的操作:按A鍵開始編輯,按ESC輸入wq儲存並退出

重點是最下面的一段內容:

m h dom mon dow commmand
複製程式碼

這個其實就是crontab排程作業的一個使用介紹,可以用來設定定時任務。

具體一點的語法是這樣的:

m h dom mon dow command
* * * * * command
- - - - - -
| | | | | |
| | | | | --- 預執行的命令
| | | | ----- 表示星期0~7(其中星期天可以用0或7表示)
| | | ------- 表示月份1~12
| | --------- 表示日期1~31
| ----------- 表示小時1~23(0表示0點)
------------- 表示分鐘1~59 每分鐘用*或者 */1表示
複製程式碼

舉幾個簡單的應用案例:

  • 每天 02:00 執行任務
0 2 * * * command
複製程式碼
  • 每天 5:00和17:00執行任務
0 5,17 * * * command
複製程式碼
  • 每 10min 執行一次任務
*/10 * * * * command
複製程式碼
  • 在特定的某幾個月的週日 17:00 執行任務
0 17 * jan,may,aug sun command
複製程式碼

差不多常用的就這些,更多的使用案例還可以參考這個連結:http://linux.51yip.com/search/crontab


上面案例中的command 表示你具體需要執行的任務,例如列印一段話:

echo "Hello xiaoyi" >> /tmp/test.txt 
複製程式碼

或者將這段話輸出到txt中:

echo "Hello xiaoyi" >> /tmp/test.txt 
複製程式碼

或者是你需要執行一個Python指令碼:

python demo.py filepath
複製程式碼

後面的filepath表示輸入的引數args,這個可能有的同學會用到,例如下面的案例中需要輸入檔案下載路徑。


5. 實戰

上面的都搞清楚了,就可以開始今天的重頭戲了。

首先我們需要每天從ftp伺服器中下載最新的任務資料,將資料下載到本地後通過Python進行資料彙總統計,最後將結果存入資料庫中,如果期間某個環節出現問題則傳送告警郵件。

① Python指令碼

首先需要Python指令碼完成以下功能:

  • 從資料庫中獲取最新資料日期
  • 從ftp中下載最新資料到本地
  • 對本地最新資料進行彙總統計
  • 統計結果存入資料庫彙總
  • 郵件通知

上面這個流程大致的虛擬碼是這樣的:

if __name__ == '__main__':
    """獲取最新資料日期"""
    latest_date = get_max_date()
    # 以最新日期為名建立資料夾
    download_dir = os.path.join(sys.argv[1], latest_date)
    if not os.path.exists(download_dir):
        os.makedirs(download_dir)
        
    """從ftp中下載最新資料"""
    download_file(latest_date, download_dir)
    """處理最新資料並儲存"""
    process_data(latest_date, download_dir)
複製程式碼

郵件監控可以在加一個try catch的異常捕獲,有異常發生的時候則傳送郵件

Python編輯郵件內容併發送以前也有寫過,可以參考下面這個:Python郵件傳送


②編寫cron任務

開啟crontab,編輯如下內容到最後一行,儲存並退出

crontab是會自動實時更新任務列表的,如果不放心也可以通過restart命令重啟cron 服務【參考文章開頭】

這裡有個小建議,所有的路徑都填寫絕對路徑


③ 效果監控

如果Python程式碼沒有問題,任務會定時執行。

這裡建議可以把自己的command單獨在控制檯執行下,沒有問題的時候再寫進到cron任務列表紅。

最終小一的定時任務執行截圖如下:

最下面是ftp檔案下載,上面是資料彙總統計



說點題外話

如果說你平時的工作有很多重複的任務,像日常指標的採集、取數彙總統計、郵件自動轉發等等

一旦這些工作你可以通過指令碼設定好邏輯,自動化任務也就可以實現它,最多就需要你每天注意一下郵件,看看有沒有發生錯誤就行了。