最近接到這樣一個任務: 定期(每天、每月)向“特定伺服器”傳輸“軟體服務”的營運資料,是以這裡涉及到一個定時任務,計劃使用Python語言添加Crontab依賴寫一個定時任務的腳本,實作每天、每月向伺服器上傳營運資料。
這篇文章是我在實作以上需求過程中,對于Crontab的使用總結。
- Crontab 概述
- Crontab 環境搭建
- Crontab 使用案例(Python)
- Crontab 使用詳解
- Crontab 操作指令行(Linux)
一、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指令操作該檔案。
二、Crontab 環境搭建
當然在正式介紹環境搭建之前,先向朋友們彙報一下我的虛拟機環境與使用的Python版本。
我使用的虛拟機環境為CentOS 7:
Python版本為Python 3.11.1:
- Centos 安裝 cronie
- Python 安裝 python-crontab 依賴
2.1 Centos 安裝 cronie
在Linux中使用Crontab之前,需要先確定安裝了Crontab,安裝指令如下:
# Centos 安裝 cronie
yum install cronie
# 檢視 Crontab 任務
crontab -l
Centos 7安裝 Crontab:
2.2 Python 安裝 python-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
三、Python中使用Crontab
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檔案與crontab指令中,每一行都包含由空格分隔的5個字段,其後跟要執行的定時任務。
4.1 crontab五個字段含義
這裡舉了幾個簡單的例子,幫助大家了解這五個字段的含義:
0 * * * * # 每小時(整點)執行一次
0 1 * * * # 每天淩晨1點執行一次
0 1 * * 0 # 每周星期日淩晨1點執行一次
0 1 1 * * # 每月1号1點執行一次
0 1 1 1 * # 每年1月1日1點執行一次
4.2 分隔與連字元用法
crontab的五個字段可能包含一個或多個值,字段内由逗号分隔或由連字元分隔:
-
* 星号運算符表示任何值或始終:
如果您在 Hour 字段中有星号符号,則表示該任務将每小時執行一次。
-
, 逗号運算符允許指定要重複的值的清單:
例如,如果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 指令行
Linux Crontab 指令行簡述如下:
- crontab -e 編輯 crontab 檔案,如果不存在則建立一個。
- crontab -l 顯示 crontab 檔案内容。
- crontab -r 删除目前的 crontab 檔案。
- crontab -i 删除您目前的 crontab 檔案,并在删除前提示。