注意:

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

開始之前

本教學課程示範如何在 Oracle Linux 上使用 crontab 命令。

背景

Oracle Linux 可依排程的工作或工作自動執行程式。您可以透過編輯 /etc/cron* 中的 cron 組態,將程式排定為系統層次的工作執行;也可以排定程式在使用者 crontab 內以工作方式執行。如果您沒有系統管理者存取權限,或想排程的程式是屬於您的使用者帳戶,則 crontab 公用程式提供良好的機制,可在您自己的使用者憑證下定期執行程式。crontab 可讓您將工作排定在每隔一分鐘執行一次,或通常一年的執行排程一次;但是,如果您在排定工作執行期間系統當機,就不應該執行 cron 工作。

請注意,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 中的預設編輯器是 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 項目輸出

在最低的 Oracle Linux 系統上或 Oracle Linux 平台映像檔上,預設不會安裝任何郵件傳輸代理程式 (MTA)。找不到 MTA 時,cron 常駐程式會將 crontab 中指定指令的輸出導向至 Syslog 常駐程式。在新安裝的 Oracle Linux 上,您可以在位於 /var/log/cron 的記錄檔中檢視 crontab 輸出。

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

sudo tail /var/log/cron

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

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

此輸出顯示執行命令的使用者,即執行的命令,然後顯示命令輸出。

如果已安裝 MTA (例如 postfixsendmail),則 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;

由於為 crontab 工作執行的指令是在 Shell 環境中執行,因此標準的 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
    

    請注意,Date 命令中的 % 字元會遁離,因為 crontab 公用程式將 % 字元變更為新行字元,而第一個 % 之後的所有資料會傳送至命令作為標準輸入。如需詳細資訊,請參閱 man 5 crontab

  3. 儲存檔案並結束。

一分鐘內應在 $HOME 目錄中顯示 crontab.log 檔案。您可以執行以下動作來檢視此檔案的內容:

tail $HOME/crontab.log

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

如果安裝 MTA,預設會傳送所有 crontab 輸出給使用者的系統郵件檔。

注意:下列指示僅供範例使用,且不描述郵件傳輸代理程式 (MTA) 的完整組態。配置預設值可能不適用於您的安裝。如果您在系統上啟用後置碼,請一併閱讀 Oracle Linux:安裝 Postfix 電子郵件伺服器,瞭解有關設定正確的資訊。

若要讓 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
    

如果您尚未設定將輸出重導至替代的郵件地址,或捨棄 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 並移除想要移除之工作的明細行。

請參閱 man 5 crontabman systemd.timer,瞭解這些功能的詳細資訊。

影片演示

如果您在 Oracle Linux 上使用 crontab 公用程式的詳細資訊,請前往 Oracle Linux Automating Tasks Cron Utility 取得視訊示範。

其他資訊

其他學習資源

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

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