最近接到這樣一個任務: 定期(每天、每月)向「特定伺服器」傳輸「軟體服務」的運營資料
,因此這裡涉及到一個定時任務,計劃使用Python語言新增Crontab依賴
寫一個定時任務的指令碼,實現每天、每月向伺服器上傳運營資料。
這篇文章是我在實現以上需求過程中,對於Crontab
的使用總結。
在Linux
環境中,Crontab
是一個排程守護行程
,可以按分鐘、小時、每月的某天、每月、每週的某天
來執行特定任務,這些特定的任務被稱為 Cron 作業
,基於這個特點,Crontab 經常被用於自動執行系統維護與管理
。
例如:可以使用 Crontab 來自動執行一些重複性的工作,比如定期傳送郵件、備份資料庫、備份軟體執行資料、下載最近的軟體修補程式等等。
Crontab 檔案:
在 Linux 環境中,當我們使用Crontab命令
建立cron 作業
後,系統中會生成一個 Crontab 文字檔案
,用於指定 cron 作業的時間表
:
Red Hat 的發行版系統
,如 CentOS,crontab 該檔案的儲存在/var/spool/cron/
目錄下;Debian 、Ubuntu等系統
中,該檔案儲存在/var/spool/cron/crontabs/
目錄下。如下所示/var/spool/cron/
目錄下的Crontab檔案:
注:
雖然我們瞭解到了 Crontab 的檔案路徑
,但並不建議手動編輯該檔案
,官方推薦在終端使用crontab
命令操作該檔案。
當然在正式介紹環境搭建之前,先向朋友們彙報一下我的虛擬機器器環境與使用的Python版本。
我使用的虛擬機器器環境為CentOS 7
:
Python版本為Python 3.11.1
:
在Linux中使用Crontab之前,需要先確保安裝了Crontab,安裝命令如下:
# Centos 安裝 cronie
yum install cronie
# 檢視 Crontab 任務
crontab -l
Centos 7安裝 Crontab:
在Python中使用 crontab ,還需要下載其對應的依賴包,下載安裝方式如下:
# 安裝Crontab
pip3 install python-crontab
Python 安裝 Crontab 依賴:
若安裝過程中遇到SSH支援問題相關的錯誤提醒,可更換如下方式進行安裝:
# 安裝Pycrypto:(豆瓣源)
pip3 install python-crontab -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
Crontab 在 Python中的使用相對簡單,我們採用如下方式建立定時任務。
from crontab import CronTab
# 建立linux系統當前使用者的crontab(當然也可以建立其他使用者的,但需要對應的許可權,如:user='root')
my_user_cron = CronTab(user=True)
# ~~~~~每日任務~~~~~
# 建立任務(指定絕對路徑)
daily_job = my_user_cron.new(
command='python3 /home/workspace/Python3ForSftpjy5g/sftp_daily.py >> /home/workspace/Python3ForSftpjy5g/assets/output/log_crontab.txt')
# "每天凌晨2點" 執行一次 sftp_daily.py
daily_job.setall('0 2 * * *')
# ~~~~~每月任務~~~~~
# 建立任務(指定絕對路徑)
monthly_job = my_user_cron.new(
command='python3 /home/workspace/Python3ForSftpjy5g/sftp_monthly.py >> /home/workspace/Python3ForSftpjy5g/assets/output/log_crontab.txt')
# "每月1日凌晨2點" 執行一次 sftp_monthly.py
monthly_job.setall('0 2 1 * *')
# 將crontab寫入linux系統組態檔
my_user_cron.write()
# 命令列輸入:python3 crontab_job.py 執行該py指令碼,則定時任務設定完畢!
# 此刻在Linux終端 輸入 contrab -l 可檢視所有定時任務。
在crontab檔案與crontab命令中,每一行都包含由空格分隔的5個欄位
,其後跟要執行的定時任務。
這裡舉了幾個簡單的例子,幫助大家理解這五個欄位的含義:
0 * * * * # 每小時(整點)執行一次
0 1 * * * # 每天凌晨1點執行一次
0 1 * * 0 # 每週星期日凌晨1點執行一次
0 1 1 * * # 每月1號1點執行一次
0 1 1 1 * # 每年1月1日1點執行一次
crontab的五個欄位可能包含一個或多個值
,欄位內由逗號分隔或由連字元分隔
:
*
星號運運算元表示任何值或始終:,
逗號運運算元允許指定要重複的值的列表:1,3,5
設定在「小時」欄位中,任務將在凌晨1點、凌晨3點、凌晨 5點執行。-
連字元運運算元允許指定一個值範圍:1-5
設定在「星期」欄位中,任務將從星期一到星期五執行。/
斜槓運運算元允許指定將在它們之間的特定間隔內重複的值。*/4
設定在「小時」欄位中,則表示該操作將每四個小時執行一次;其與0,4,8,12,16,20
的設定含義相同。這裡舉了幾個簡單的例子,幫助大家理解分隔與連字元用法:
*/5 * * * * # 每5分鐘執行一次
0 8-16 * * * # 每天從上午8點到下午4點整點執行一次
0 15 * * 1-5 # 週一到週五每天15:00執行一次
0 3 1,15 * * # 每個月1號、15號凌晨3點執行一次
Linux Crontab 命令列簡述如下:
crontab -e
編輯 crontab 檔案,如果不存在則建立一個。crontab -l
顯示 crontab 檔案內容。crontab -r
刪除當前的 crontab 檔案。crontab -i
刪除您當前的 crontab 檔案,並在刪除前提示。python-crontab:
https://pypi.org/project/python-crontab/
使用 Crontab 設定 Cron 任務:
https://linuxize.com/post/scheduling-cron-jobs-with-crontab/
文章首發於公眾號」CODING技術小館「,如果文章對您有幫助,歡迎關注我的公眾號。