備註:

使用 Crontab 公用程式排定 Oracle Linux 上的作業

開始前

本教學課程示範如何在 Oracle Linux 上使用 crontab 命令。本教學課程的適用對象是 Oracle Linux 8 個使用者,但是其他 Oracle Linux 版本也提供這些命令。

背景

Oracle Linux 可以將排程的作業或工作自動執行程式。您可以在 /etc/cron* 中編輯 cron 組態,將程式排程為系統層級作業,也可以將程式排程為使用者 crontab 中的工作。如果某個系統或您要排定的程式沒有系統管理員存取權,則該 crontab 公用程式可根據您的使用者憑證,提供在一般排程上執行程式的良好機制。crontab 可讓您將工作排定成每分鐘執行或一年不常執行一次;不過,您還是要注意,如果在排程執行工作時系統停止運作,則 cron 工作將不會執行。

本教學課程的目標對象為 Oracle Linux 8 使用者,但 Oracle Linux 7 也提供 crontab,為此教學課程的內容應平均套用至該平台。請注意,cron 組態是大部分的 Linux 系統上的標準,從 1975 年起就可以使用類似 Unix 的系統。較複雜的排程解決方案以計時器與使用者形式納入 Systemd 中,並鼓勵使用者更深入探索 Systemd 計時器以解決特定需求。不過,本自學課程可提供適用於平均使用者的基礎訓練。

軟硬體需求

目標

在本教學課程中,您將學會:

列出 crontab 檔案的內容

注意:使用免費實驗室環境時,請參閱 Oracle Linux Lab Basics 以取得連線和其他使用指示。

使用 crontab -l 指令列出 crontab 檔案的內容。

crontab -l

如果使用者沒有 crontab 項目,將會顯示下列訊息:

no crontab for oracle

建立或編輯您的 crontab

  1. 使用 crontab –e 命令,在預設編輯器中開啟您的 crontab:

    crontab -e
    

    Oracle Linux 8 中的預設編輯器是 vim 編輯器。

  2. 在檔案結尾新增以下這一行,以建立每分鐘執行 echo 命令的 crontab 工作:

    * * * * * echo "Hello World"
    

    使用 vim :

    • 您可以按 'Shift-g「 以跳至檔案的底部。
    • 請點擊 'i「 鍵以輸入插入模式。
    • 輸入 crontab 行。
    • 按下 'Esc「 鍵以結束插入模式。
    • 輸入 ':wq「 以寫入檔案並結束編輯器。

    此步驟會安裝 crontab,讓它立即生效:

    crontab: installing new crontab
    
  3. 列出 crontab 中的項目以顯示新項目:

    crontab -l
    

每個工作都會在 crontab 的一行顯示。crontab 具有 5 個以空格分隔的欄位,這些欄位可以定義可以配置的不同時間週期,然後定義針對工作執行的指令。此指令等同於您在系統上指令行執行的任何指令,可讓您執行自己的程序檔,或利用管道和重新導向運算子。

檢查您的 cron 輸入輸出

預設不會將任何郵件傳輸代理程式 (MTA) 安裝在最小的 Oracle Linux 系統或 Oracle Linux 平台映像檔上。找不到 MTA 時,cron 協助程式會從 crontab 指定的命令將輸出導向至 Syslog 協助程式。在 Oracle Linux 8 的新安裝上,您可以在日誌檔中檢視 crontab 輸出,網址為 /var/log/cron

執行下列命令以檢視新的 crontab 項目所產生的輸出:

sudo tail /var/log/cron

請注意,cron 作業每分鐘只會執行一次,因此您可能需要等一分鐘後,才能執行命令。此 cron 項目的輸出應該類似於:

Jun 30 12:39:02 ol8-server CROND[68564]: (oracle) CMD (echo "Hello World")
Jun 30 12:39:02 ol8-server CROND[68551]: (oracle) CMDOUT (Hello World)

輸出顯示執行命令的使用者身分、執行命令,然後顯示命令輸出。

如果安裝 MTA (例如 postfixsendmail),則 cron 會從 crontab 項目將輸出導向至執行 crontab 項目的使用者的郵件排存。本教學課程稍後將會進一步討論。

Crontab 時間序列選項

Crontab 時間欄位會以下列順序定義:

特殊字元可在任何時間欄位中使用:

crontab 也可讓您使用特殊的手頭延伸來取代一般時間需求的時間欄位。重要的是,這個縮寫還包含一個在重新啟動之後執行命令的選項:

請注意,crontab 只提供 1 分鐘的精細度。設定比每分鐘更頻繁執行的 crontab 項目並不容易。如果您正在尋找可以處理此工具的工具,請考慮看系統的計時器單位。

編輯 crontab,嘗試不同時序執行不同的指令

  1. 使用 crontab –e 命令,在預設編輯器中開啟您的 crontab:

    crontab -e
    
  2. 將下列項目新增到 crontab:

    */15 * * * * echo "This crontab entry runs every 15 minutes"
    10 * * * * echo "This crontab entry runs at 10 minutes past every hour"
    30 13 * * 3 echo "This crontab entry runs at 13h30 on every Wednesday"
    @reboot echo "This command runs once after a reboot event"
    
  3. 儲存 crontab 檔案並結束。

Crontab 命令語法

crontab 命令會在使用者屬於 crontab 並以某些預設環境變數集執行的證明資料執行,包括:

您可以將替代環境變數指定為不含時間欄位的 crontab 中的行,例如如果您想要使用 bash shell,而想要定期匯入所有含個人 .bashrc 組態的變數與設定,您可以編輯 crontab,如下所示:

SHELL=/bin/bash
* * * * * source $HOME/.bashrc;

由於在 Shell 環境內執行 crontab 工作的命令,因此會套用標準 Shell 語法並可用來進行導管或重新導向輸出。例如,若要將所有輸出重新導向至 /dev/null,將工作的任何已通過輸出停用,請在命令上使用 STDOUT 和 STDERR 輸出的標準 Shell 重新導向:

* * * * * /path/to/command > /dev/null 2>&1

或者,您也可以將輸出重新導向到一個檔案,您可以在每次執行指令輸出時都用來追蹤指令輸出:

* * * * * /path/to/command >> $HOME/command.log

使用命令語法編輯 crontab 實驗

  1. 使用 crontab -e 指令,在編輯器中開啟 crontab。

  2. 新增下列項目:

    */15 * * * * echo "This 'silent' crontab entry runs every 15 minutes but output is redirected to /dev/null" > /dev/null 2>&1
    * * * * * echo "The date and time is $(date +\%Y-\%m-\%d\ \%H:\%M:\%S)" >> $HOME/crontab.log
    

    請注意,日期指令中的 % 字元會被遁離,因為 % 字元會透過 crontab 公用程式變更為換行字元,而前 % 之後的所有資料都會以標準輸入方式傳送至指令。如需詳細資訊,請參閱 man 5 crontab

  3. 儲存檔案並結束。

一分鐘內,crontab.log 檔案應出現在 $HOME 目錄中。您可以執行下列操作來檢視此檔案的內容:

tail $HOME/crontab.log

存取本機郵件排存區的 crontab 輸出

如果安裝 MTA,所有 crontab 輸出預設都會透過電子郵件傳送至使用者的系統郵件排存。

注意:下列指示僅供範例之用,請勿描述郵件傳輸代理程式 (MTA) 的完整組態。配置預設值不適用於您的安裝。如果您在系統上啟用後置碼,請同時閱讀 Oracle Linux:安裝 Postfix Email Server 以瞭解設定正確的資訊。

若要讓 crontab 郵件處理正確運作,您必須安裝、配置以及啟用 MTA。在本練習的目的中,您可以簡單執行下列步驟,讓 postfix MTA 處理本機郵件:

  1. 安裝 postfix 套裝軟體:

    sudo dnf install -y postfix
    
  2. 啟用並啟動 Postfix 服務 。預設組態僅會啟用後置碼作為本端交貨 MTA:

    sudo systemctl enable --now postfix.service
    
  3. 重新啟動 crond 服務,讓它開始使用 Postfix MTA 處理郵件遞送:

    sudo systemctl restart crond.service
    

如果您尚未設定 crontab 將輸出重新導向到替代的電子郵件地址,或捨棄 cron 工作的輸出,每一工作的輸出都會自動傳遞至使用者的本機郵件排存。郵件排存通常儲存為單一郵件檔案,可在 /var/spool/mail/$USER 存取。如果您只是監督最近的活動,則最容易修改此檔案,以在傳遞時看到郵件:

tail -f /var/spool/mail/$USER

若要在可管理的介面中複查每個 cron 工作的輸出,請安裝 mailx 套裝軟體,並使用 mail 指令來檢視郵件排存的內容:

sudo dnf install -y mailx
mail

郵件會以下列方式列出:

Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/oracle": 1 messages 1 new
>N  1 (Cron Daemon)         Wed Aug  5 23:48  30/1436  "Cron oracle
&

輸入要檢視的郵件訊息數目。例如,輸入 1 以檢視佇列中的第一個訊息:

& 1
Hello World

使用 header 命令返回郵件標頭清單,或使用 quit 命令結束應用程式。

您可以在 crontab 中設定 MAILTO 環境變數,以變更郵件 cron 輸出所使用的電子郵件地址,但您的系統必須設定為處理外部郵件傳遞。如果您將 MAILTO 環境設為空白值,則會捨棄輸出,而且不會傳送 crontab 中任何 cron 工作的郵件。

刪除整個 crontab

使用 crontab -r 指令可移除使用者的整個 crontab。

crontab -r

這個指令會移除您為使用者指定的所有 cron 工作項目。如果您只想移除特定的工作項目,請使用 crontab -e 編輯 crontab,然後移除您要移除之工作的行。

影片演示

如果您需要使用 Oracle Linux 8 上的 crontab 公用程式,可在 https://www.youtube.com/watch?v=BpPGoRYTv9I 提供視訊示範。

Oracle Linux 8 自動化作業 Cron 公用程式

其他資訊

其他學習資源

探索 docs.oracle.com/learn 上的其他實驗室,或是存取更多免費學習內容至 Oracle Learning YouTube 通道。此外,瀏覽 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。

如需產品文件,請瀏覽 Oracle Help Center