任務自動化 :用 Python 創建 Crontab 任務
如果你不知道Crontab是什么,它是一個用于Unix和類Unix操作系統的實用工具,允許你在特定時間自動安排和執行任務。Crontab的一個很大優勢是,它在崩潰或重啟后仍然有效。Crontab條目保存在由cron守護進程讀取的文件中,該守護進程在系統啟動時自動啟動。
本文的目的是使用python-crontab庫編寫Python程序的執行計劃。這個庫允許你使用API在操作系統中生成crontab文件,而不必使用特定的操作系統命令。
首先,我們安裝該庫:
poetry add python-crontab
然后,我們創建一個名為create_crontab.py的文件,并包含以下內容:
if __name__ == '__main__':
cron_tab = CronTab(user=True)
list_cron(cron_tab)
delete_cron(cron_tab)
create_cron(cron_tab)
list_cron(cron_tab)
- cron_tab = CronTab(user=True): 我們創建一個與當前用戶crontab關聯的CronTab對象。這將允許我們訪問和操作計劃任務。
- list_cron(cron_tab): 我們將創建一個名為list_cron的函數,用于在屏幕上顯示所有計劃任務的列表。
- delete_cron(cron_tab): 我們將創建一個函數,用于在創建計劃任務之前從crontab中刪除所有計劃任務。這一步在更新計劃定義時非常有用。
- create_cron(cron_tab): 我們將實現一個create_cron函數,用于創建新的計劃任務并將它們添加到crontab中。
列出計劃任務
我們將CronTab對象傳遞給此函數并迭代不同的任務。
def list_cron(cron):
for job in cron:
print(job)
刪除計劃任務
在進行更改時,總是強制crontab寫入。
def delete_cron(cron):
cron.remove_all()
cron.write()
創建計劃任務
假設我們要安排執行位于以下絕對路徑的程序:
/Users/xavierescudero/Projects/tutorial-trading-bot/tutorial_trading_bot/exchange_historical_importer.py
Crontab腳本在后臺運行,不在我們的項目內,因此它不知道模塊路徑。我們需要給它指示:
- 進入根目錄:cd /Users/xavierescudero/Projects/tutorial-trading-bot
- 在Poetry管理的虛擬環境中運行模塊:poetry run -m tutorial_trading_bot.exchange_historical.importer
- 使用-m選項,Python會在系統搜索目錄和當前目錄中查找模塊,導入它,并像獨立腳本文件一樣運行它。
模塊目錄的位置
我們可以使用pathlib從create_crontab.py模塊文件的相對路徑獲取項目的根目錄:
from pathlib import Path
PROJECT_DIR_PATH = str(Path(__file__).parent.parent)
并創建到此目錄的目錄更改命令鏈:
CD_PROJECT_DIR_COMMAND = ''.join(['cd ', PROJECT_DIR_PATH])
定義要執行的命令
我們創建執行的初始部分,這將用于任何模塊:
EXECUTOR_COMMAND = ' '.join(['poetry', 'run python -m tutorial_trading_bot.'])
我們構建了運行每個模塊的完整命令(包括目錄更改):
EXECUTOR_PATH = ';'.join([CD_PROJECT_DIR_COMMAND, EXECUTOR_COMMAND])
HISTORICAL_IMPORTER_JOB = ''.join([EXECUTOR_PATH, 'exchange_historical_importer', ' &'])
TRADING_BOT_JOB = ''.join([EXECUTOR_PATH, 'trading_bot', ' &'])
定義計劃任務
現在我們有了命令,使用python-crontab庫的new()函數創建計劃任務,并用setall設置cron表達式。
def create_cron(cron):
"""
Check crontab values using https://crontab.guru
"""
cron.new(command=HISTORICAL_IMPORTER_JOB).setall('59 21 * * *') # At 21:59 every day
cron.new(command=TRADING_BOT_JOB).setall('59 22 * * *')
cron.write()
在網站https://crontab.guru上,你可以驗證你的cron表達式,并找到大量示例。
重啟時執行(無需計劃)
當你不在家時,發現Python進程在重啟后沒有重新啟動是一件糟糕的事。這可能很令人沮喪,因為這意味著你的自動化任務或服務沒有運行。
我們還可以使用python-crontab庫在重啟時啟動程序:
cron.new(command=TRADING_BOT_JOB).every_reboot()
設置cron任務
我們現在可以從shell安裝我們的編程:
poetry run python -m tutorial-trading-bot.create_crontab
我們將在屏幕上看到計劃任務的列表:
2024-06-07 00:15:46,872 - __main__ - INFO - Crontab configured
59 21 * * *