注意:
- 本教學課程包含在 Oracle 提供的免費實驗室環境中。
- 它會使用 Oracle Cloud Infrastructure 證明資料、租用戶以及區間的範例值。完成實驗室之後,請將這些值取代為您雲端環境特有的值。
使用 Crontab 公用程式排定 Oracle Linux 上的作業
開始之前
本教學課程示範如何在 Oracle Linux 上使用 crontab 命令。
背景
Oracle Linux 可依排程的工作或工作自動執行程式。您可以透過編輯 /etc/cron*
中的 cron 組態,將程式排定為系統層次的工作執行;也可以排定程式在使用者 crontab 內以工作方式執行。如果您沒有系統管理者存取權限,或想排程的程式是屬於您的使用者帳戶,則 crontab 公用程式提供良好的機制,可在您自己的使用者憑證下定期執行程式。crontab 可讓您將工作排定在每隔一分鐘執行一次,或通常一年的執行排程一次;但是,如果您在排定工作執行期間系統當機,就不應該執行 cron 工作。
請注意,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 中的預設編輯器是 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 項目輸出
在最低的 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 (例如 postfix 或 sendmail),則 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:用來執行命令的 Shell 二進位檔。此選項預設為
/bin/sh
。 - PATH:crontab 公用程式可用的路徑。此選項預設為
/usr/bin:/bin
。
您可以將替代環境變數指定為 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
-
使用
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
請注意,Date 命令中的 % 字元會遁離,因為 crontab 公用程式將 % 字元變更為新行字元,而第一個 % 之後的所有資料會傳送至命令作為標準輸入。如需詳細資訊,請參閱
man 5 crontab
。 -
儲存檔案並結束。
一分鐘內應在 $HOME 目錄中顯示 crontab.log 檔案。您可以執行以下動作來檢視此檔案的內容:
tail $HOME/crontab.log
存取本機郵件排存中的 crontab 輸出
如果安裝 MTA,預設會傳送所有 crontab 輸出給使用者的系統郵件檔。
注意:下列指示僅供範例使用,且不描述郵件傳輸代理程式 (MTA) 的完整組態。配置預設值可能不適用於您的安裝。如果您在系統上啟用後置碼,請一併閱讀 Oracle Linux:安裝 Postfix 電子郵件伺服器,瞭解有關設定正確的資訊。
若要讓 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
如果您尚未設定將輸出重導至替代的郵件地址,或捨棄 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 crontab
和 man 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。
Use the Crontab Utility to Schedule Tasks on Oracle Linux
F49748-04
July 2022
Copyright © 2021, Oracle and/or its affiliates.