備註:
- 本教學課程隨附於 Oracle 提供的免費實驗室環境。
- 此範例使用 Oracle Cloud Infrastructure 證明資料、租用戶及區間的範例值。完成實驗室時,請將這些值替代成雲端環境的特定值。
使用 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 計時器以解決特定需求。不過,本自學課程可提供適用於平均使用者的基礎訓練。
軟硬體需求
- 已安裝 Oracle Linux 的系統
目標
在本教學課程中,您將學會:
- 列出現有 crontab 的內容
- 建立與編輯 crontab 項目
- 存取 crontab 輸出
- 移除使用者的完整 crontab
列出 crontab 檔案的內容
注意:使用免費實驗室環境時,請參閱 Oracle Linux Lab Basics 以取得連線和其他使用指示。
使用 crontab -l
指令列出 crontab 檔案的內容。
crontab -l
如果使用者沒有 crontab 項目,將會顯示下列訊息:
no crontab for oracle
建立或編輯您的 crontab
-
使用
crontab –e
命令,在預設編輯器中開啟您的 crontab:crontab -e
Oracle Linux 8 中的預設編輯器是 vim 編輯器。
-
在檔案結尾新增以下這一行,以建立每分鐘執行 echo 命令的 crontab 工作:
* * * * * echo "Hello World"
使用 vim :
- 您可以按 'Shift-g「 以跳至檔案的底部。
- 請點擊 'i「 鍵以輸入插入模式。
- 輸入 crontab 行。
- 按下 'Esc「 鍵以結束插入模式。
- 輸入 ':wq「 以寫入檔案並結束編輯器。
此步驟會安裝 crontab,讓它立即生效:
crontab: installing new crontab
-
列出 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 (例如 postfix 或 sendmail),則 cron 會從 crontab 項目將輸出導向至執行 crontab 項目的使用者的郵件排存。本教學課程稍後將會進一步討論。
Crontab 時間序列選項
Crontab 時間欄位會以下列順序定義:
- 分鐘:從 0 到 59
- 小時:從 0 到 23
- 天:從 1 到 31
- 月份:從 1 到 12,或是月份的名稱
- 星期幾:從 0 到 7,或日縮寫。請注意,0 與 7 皆代表星期日。
特殊字元可在任何時間欄位中使用:
- 星號 (*):指定應對欄位的每個例項執行指令
- 連字號 (-):可用來表示範圍。例如,在「星期幾」欄位中,您可以指定 1-5 來排定任務從星期一到星期五,但不要在星期六或星期日執行。
- 逗號 (,):可用來指定欄位的值清單。例如,在小時欄位中,您可以指定 6,18 來排定在上午 6 點和下午 6 點執行的工作。
- 正斜線 (/):可用來指定步驟值。例如,您可以在「分鐘」欄位中指定 */15,將工作排定每 15 分鐘執行。
crontab 也可讓您使用特殊的手頭延伸來取代一般時間需求的時間欄位。重要的是,這個縮寫還包含一個在重新啟動之後執行命令的選項:
- @reboot:重新啟動後執行一次。
- @yearly :每年執行一次,例如 "0 0 1 1 *"。
- @annually :每年執行一次,例如 "0 0 1 1 *"。
- @monthly :每個月執行一次,例如 "0 0 1 * *"。
- @weekly :每週執行一次,亦即 "0 0 * 0"。
- @daily :每天執行一次,例如 "0 0 * * *"。
- @hourly :每小時執行一次,例如 "0 * * * *"。
請注意,crontab 只提供 1 分鐘的精細度。設定比每分鐘更頻繁執行的 crontab 項目並不容易。如果您正在尋找可以處理此工具的工具,請考慮看系統的計時器單位。
編輯 crontab,嘗試不同時序執行不同的指令
-
使用
crontab –e
命令,在預設編輯器中開啟您的 crontab:crontab -e
-
將下列項目新增到 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"
-
儲存 crontab 檔案並結束。
Crontab 命令語法
crontab 命令會在使用者屬於 crontab 並以某些預設環境變數集執行的證明資料執行,包括:
- HOME:crontab 執行時使用者的主目錄
- LOGNAME:等同於 crontab 執行的使用者名稱
- USER:crontab 執行的使用者名稱
- 殼層:用於執行指令的 Shell 二進位資料。此選項預設為
/bin/sh
。 - PATH:crontab 公用程式可用的路徑。此選項預設為
/usr/bin:/bin
。
您可以將替代環境變數指定為不含時間欄位的 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 實驗
-
使用
crontab -e
指令,在編輯器中開啟 crontab。 -
新增下列項目:
*/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
。 -
儲存檔案並結束。
一分鐘內,crontab.log 檔案應出現在 $HOME 目錄中。您可以執行下列操作來檢視此檔案的內容:
tail $HOME/crontab.log
存取本機郵件排存區的 crontab 輸出
如果安裝 MTA,所有 crontab 輸出預設都會透過電子郵件傳送至使用者的系統郵件排存。
注意:下列指示僅供範例之用,請勿描述郵件傳輸代理程式 (MTA) 的完整組態。配置預設值不適用於您的安裝。如果您在系統上啟用後置碼,請同時閱讀 Oracle Linux:安裝 Postfix Email Server 以瞭解設定正確的資訊。
若要讓 crontab 郵件處理正確運作,您必須安裝、配置以及啟用 MTA。在本練習的目的中,您可以簡單執行下列步驟,讓 postfix MTA 處理本機郵件:
-
安裝 postfix 套裝軟體:
sudo dnf install -y postfix
-
啟用並啟動 Postfix 服務 。預設組態僅會啟用後置碼作為本端交貨 MTA:
sudo systemctl enable --now postfix.service
-
重新啟動 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 公用程式
其他資訊
man 5 crontab
man systemd.timer
- Oracle Linux:安裝 Postfix 電子郵件伺服器
- Oracle Linux 文件
- Oracle Learning Library
其他學習資源
探索 docs.oracle.com/learn 上的其他實驗室,或是存取更多免費學習內容至 Oracle Learning YouTube 通道。此外,瀏覽 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。
如需產品文件,請瀏覽 Oracle Help Center。
Use the Crontab Utility to Schedule Tasks on Oracle Linux
F49748-03
May 2022
Copyright © 2021, Oracle and/or its affiliates.