一文詳解 Linux Crontab 排程任務

2023-01-13 06:01:22

最近接到這樣一個任務: 定期(每天、每月)向「特定伺服器」傳輸「軟體服務」的運營資料,因此這裡涉及到一個定時任務,計劃使用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 檔案,並在刪除前提示。

參考

python-crontab:
https://pypi.org/project/python-crontab/
使用 Crontab 設定 Cron 任務:
https://linuxize.com/post/scheduling-cron-jobs-with-crontab/

= THE END =

文章首發於公眾號」CODING技術小館「,如果文章對您有幫助,歡迎關注我的公眾號。